matplotlib 如何在嵌套饼图中制作不同大小的子部分

rbpvctlc  于 2023-05-18  发布在  其他
关注(0)|答案(1)|浏览(165)

我在Python中使用matplotlib。我试图做一个嵌套饼图,其中内环是一种运输方式,外环是它所组成的子部分。
我有这个代码:

import matplotlib.pyplot as plt
import numpy as np    

fig, ax = plt.subplots()

size = 0.3
vals = np.array([[60., 32., 13.], [37., 40., 45.], [29., 10., 35.]])

cmap = plt.get_cmap("tab20c")
outer_colors = cmap(np.arange(3)*4)
inner_colors = cmap([1, 2, 3, 5, 6, 7, 9, 10, 11])

ax.pie(vals.sum(axis=1), radius=3-0.9, colors=outer_colors,
       wedgeprops=dict(width=0.9, edgecolor='w'),labels=["Car","Public Transport","Bike"],
       pctdistance=1.1, labeldistance=0.65)

ax.pie(vals.flatten(), radius=3, colors=inner_colors,
       wedgeprops=dict(width=0.9, edgecolor='w'),labels=["Gasoline","Diesel","Electric","Bus","Tram","Train", "Normal Bike","E-Bike","Motorbike"],
       pctdistance=1.1, labeldistance=0.85)

ax.set(aspect="equal", title='')
plt.show()

Which leads to this nested pie chart
我想不出如何使子部件的尺寸不同。例如,让我们假设我想添加三轮车和独轮车到自行车类别。因此,汽车和公共交通将是3号,而自行车是5号。
我可以让所有的子部分是2,3或4等。只要VAL阵列中的列表具有相同大小。但是如果我将其中一个设置成不同的大小,那么我将以AxisError结束。有没有什么方法可以修改这个代码,让我可以自由选择他们的大小?

dxpyg8gm

dxpyg8gm1#

这是关于数据的结构。
把所有东西都放进一个字典里,用户就可以添加任何他们喜欢的东西,而且数字是一致的。
以下是您的数据示例(为了清楚起见,我删除了彩色图):

import matplotlib.pyplot as plt

d = {
    "car":{"Gasoline":60,"Diesel":32,"Electric":13},
    "Public Transport":{"Bus":37,"Tram":40,"Train":45}, 
    "bike":{"Normal Bike":29,"E-Bike":10,"Motorbike":35, "Tricycle":5, "Unicycle":15}
    }

# outer values
cars = sum(d['car'].values())
pt = sum(d['Public Transport'].values())
bike = sum(d['bike'].values())

outer_values = [cars, pt, bike]
outer_labels =d.keys()

inner_values = []
inner_labels = []
for vehicle_type in d.values():
    for vehicle_names, vehicle_amounts in vehicle_type.items():
        inner_values.append(vehicle_amounts)
        inner_labels.append(vehicle_names)

fig, ax = plt.subplots()

ax.pie(outer_values, labels=outer_labels, radius=1)
ax.pie(inner_values, labels=inner_labels, radius=0.5)

ax.set_title("My Nested Pie Chart")

plt.show()

结果是这样的:

相关问题