How can I split the wedges of a pie chart to show extra information per wedge in consecutive rings?

I'm plotting disk partitioning and available space.

I have a pie chart showing the partitioning: e.g. 30% `/`, 70% `/home`.

In the second ring I want to show that 90% `/` is full, 10% of `/` is empty. 10% `/home` is full, 90% `/home` is empty.

How can I generate the 'second' series of the wedges?

Please give example in LibreOffice, gnuplot, matplotlib, etc.

Something like this:

Assume your data is in the format:

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

Try using the `reportlab.graphics` library (available from the Ubuntu and Fedora repositories as `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()]))

# 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)

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

Sample output:

It can also be done quite simply in Mathematica (tested on the Linux version):

``````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]
``````

Or if you want the colors to match:

``````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]
``````

• awesome! now same using opensource tools? =) – Dima Aug 1 '12 at 15:57
• @Dima: `reportlab.graphics` is open-source. – Mechanical snail Aug 1 '12 at 15:58