Como posso dividir as fatias de um gráfico de pizza para mostrar informações extras por cunha em anéis consecutivos?

4

Estou planejando o particionamento de disco e o espaço disponível.

Eu tenho um gráfico de pizza mostrando o particionamento: por exemplo, 30% / , 70% /home .

No segundo anel, quero mostrar que 90% / está cheio, 10% de / está vazio. 10% /home está cheio, 90% /home está vazio.

Como posso gerar a 'segunda' série das cunhas?

Por favor, dê um exemplo no LibreOffice, gnuplot, matplotlib, etc.

Algo parecido com isto:

    
por Dima 31.01.2012 / 16:12

2 respostas

3

Suponha que seus dados estejam no formato:

data = {
    # partition: (frac of disk, frac full)
    "/": (0.3, 0.9),
    "/home": (0.7, 0.1),
}

Tente usar a biblioteca reportlab.graphics (disponível nos repositórios do Ubuntu e do Fedora como python-reportlab ):

from reportlab.graphics.shapes import Drawing
from reportlab.graphics.charts.piecharts import Pie
from reportlab.graphics import renderSVG
from itertools import chain
d = Drawing(400, 400)

outerPie = Pie()
outerPie.x = outerPie.y = 0
outerPie.width = outerPie.height = 400
# 2 slices for each sector (used, unused)
outerPie.data = list(chain(*[
    [fracDisk * fracPart, fracDisk * (1 - fracPart)]
    for (fracDisk, fracPart) in data.values()]))
d.add(outerPie, '')

# Draw smaller pie chart on top of outerPie, leaving outerPie as a ring
innerPie = Pie()
innerPie.x = innerPie.y = 100
innerPie.width = innerPie.height = 200
innerPie.data = [t[0] for t in data.values()]
innerPie.labels = list(data)
d.add(innerPie, '')

renderSVG.drawToFile(d, 'chart.svg')

Exemplo de saída:

    
por 01.08.2012 / 15:19
2

Também pode ser feito simplesmente no Mathematica (testado na versão para Linux):

data = {{"/", 0.3, 0.9}, {"/home", 0.7, 0.1}};
PieChart[{
  Labeled[#[[2]], #[[1]]] & /@ data,
  Flatten[{Labeled[#[[2]] *    #[[3]] , "used"], 
           Labeled[#[[2]] * (1-#[[3]]), "free"]} & /@ data]
}, SectorSpacing -> 0]

Ou se você quiser que as cores correspondam:

data = {{"/", 0.3, 0.9, Red}, {"/home", 0.7, 0.1, Blue}};
PieChart[{
  Style[Labeled[#[[2]], #[[1]]], #[[4]]] & /@ data,
  Flatten[{Style[Labeled[#[[2]] *    #[[3]] , "used"], #[[4]]], 
           Style[Labeled[#[[2]] * (1-#[[3]]), "free"], Lighter@#[[4]]]} & /@ data]
}, SectorSpacing -> 0]

    
por 01.08.2012 / 15:50