¿Cómo puedo dividir las porciones de un gráfico circular para mostrar información adicional por porción en anillos consecutivos?

¿Cómo puedo dividir las porciones de un gráfico circular para mostrar información adicional por porción en anillos consecutivos?

Estoy trazando la partición del disco y el espacio disponible.

Tengo un gráfico circular que muestra la partición: por ejemplo, 30% /, 70% /home.

En el segundo anillo quiero mostrar que el 90% /está lleno y el 10% /está vacío. El 10% /homeestá lleno, el 90% /homeestá vacío.

¿Cómo puedo generar la 'segunda' serie de cuñas?

Dé un ejemplo en LibreOffice, gnuplot, matplotlib, etc.

Algo como esto:

ingrese la descripción de la imagen aquí

Respuesta1

Suponga que sus datos están en el formato:

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

Intente usar la reportlab.graphicsbiblioteca (disponible en los repositorios de Ubuntu y 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')

Salida de muestra:

Salida de muestra del gráfico

Respuesta2

También se puede hacer de forma bastante sencilla en Mathematica (probado en la versión de 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]

O si quieres que los colores combinen:

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]

Gráfico circular

información relacionada