绘制多个圆环图

Drawing multiple donut charts

我正在编写代码来输出 3 个圆环图。我先画了3个饼图,然后我想给每个饼图都填上一个白圈

我成功输出了3个饼图,但是白色圆圈只出现在最后一个。

如何让它出现在所有三个上?

fig, axes = plt.subplots(1,3, figsize=(10,5))
for ax, col in zip(axes, df.columns):
    ax.pie(df[col], labels=None,  colors=colors)
    ax.set(ylabel='', title=col, aspect='equal')
    centre_circle = plt.Circle((0,0),0.70,fc='white')
    fig = plt.gcf()
    fig.gca().add_artist(centre_circle)

axes[0].legend(labels, bbox_to_anchor=(0, 0.5))



fig.savefig('your_file.png')
plt.show()

因为fig.gca()持有图中最后创建的轴,所以白色圆圈被放置在那里三次独立于循环变量。
您可以使用 ax 变量

在每次迭代中简单地将圆形艺术家添加到轴上
ax.add_artist(centre_circle)

然而,你的方法对我来说似乎是一个不必要的解决方法,因为你可以通过使用 wedgeprops kwarg 及其 width 参数来完成甜甜圈形状(参见 here进一步的):

尝试例如

ax.pie(df[col], labels=None, colors=colors, wedgeprops=dict(width=.3))

无需在每次创建饼图后手动绘制白色圆圈。


完整示例:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

np.random.seed(42)
df = pd.DataFrame(np.random.randint(5, 10, (7, 3)), columns=['a', 'b', 'c'])

fig, axes = plt.subplots(1,3, figsize=(10,5))
for ax, col in zip(axes, df.columns):
    ax.pie(df[col], wedgeprops=dict(width=.3))
    ax.set(ylabel='', title=col, aspect='equal')


请注意,您甚至不必遍历列,而是可以直接从 pandas 数据框创建饼图:

df.plot(kind='pie', subplots=True, wedgeprops=dict(width=.3), legend=False, labels=None)

结果: