三级饼图 matplotlib - 如何 "prettify"
three level pie plot matplotlib - how to "prettify"
我正在尝试在 matplotlib 中模拟一个三层饼图,但对它的美学不满意。
具体来说,我似乎不能让三个层次(或甜甜圈)更有特色。另外,我想理想地将标签显示为图例,而不是它们当前的显示方式。最后,如果可能的话,我希望得到一组互补的 8 种颜色。
我的代码如下:
import matplotlib.pyplot as plt
import numpy as np
first_labels = ["B", "S", "D", "SG", "OBGL", "G", 'T', "O", "I"]
first_sizes = [2000, 300, 200, 100, 100, 150, 40, 30, 700]
second_sizes = [1000, 200, 200, 400, 500, 40, 1, 1, 1000]
third_sizes = [500, 300, 400, 500, 400, 100, 5, 2, 800]
flatui = (sns.diverging_palette(20, 250, n=8))
bigger = plt.pie(first_sizes, labels=first_labels, colors=flatui,
startangle=90, frame=True, radius = 1)
smaller = plt.pie(second_sizes,
colors=flatui, radius=0.9,
startangle=90, labeldistance=0.9)
smallest = plt.pie(third_sizes,
colors=flatui, radius=0.8,
startangle=90, labeldistance=0.8)
centre_circle = plt.Circle((0, 0), 0.7, color='white', linewidth=0)
fig = plt.gcf()
fig.gca().add_artist(centre_circle)
plt.axis('equal')
plt.tight_layout()
plt.show()
有人可以建议如何 "prettify" 饼图吗?
来自 documentation of plt.pie and this page:
[...]
wedgeprops : dict, optional, default: None
Dict of arguments passed to the wedge objects making the pie. For example, you can pass in wedgeprops = {'linewidth': 3} to set the
width of the wedge border lines equal to 3. For more details, look at
the doc/arguments of the wedge object. By default clip_on=False.
[...]
您可以通过将名为 wedgeprops
的字典提供给您的饼图来自定义楔形。例如:
[...] repeating your code [...]
bigger = plt.pie(first_sizes, labels=first_labels, colors=flatui,
startangle=90, frame=True, radius = 1,
wedgeprops={'edgecolor':'k'})
smaller = plt.pie(second_sizes,
colors=flatui, radius=0.9,
startangle=90, labeldistance=0.9,
wedgeprops={'edgecolor':'k'})
smallest = plt.pie(third_sizes,
colors=flatui, radius=0.8,
startangle=90, labeldistance=0.8,
wedgeprops={'edgecolor':'k'})
centre_circle = plt.Circle((0, 0), 0.7, color='white', linewidth=0)
fig = plt.gcf()
fig.gca().add_artist(centre_circle)
# add legend to current ax:
plt.gca().legend(loc='center right', bbox_to_anchor=(1,0,0.5,0.5))
如果您只想要图例中的标签而不是绘图中的标签:
# make first pie without labels:
bigger = plt.pie(first_sizes, colors=flatui,
startangle=90, frame=True, radius = 1,
wedgeprops={'edgecolor':'k'})
# feed labels to legend:
plt.gca().legend(first_labels, loc='center right', bbox_to_anchor=(1,0,0.5,0.5))
我正在尝试在 matplotlib 中模拟一个三层饼图,但对它的美学不满意。
具体来说,我似乎不能让三个层次(或甜甜圈)更有特色。另外,我想理想地将标签显示为图例,而不是它们当前的显示方式。最后,如果可能的话,我希望得到一组互补的 8 种颜色。
我的代码如下:
import matplotlib.pyplot as plt
import numpy as np
first_labels = ["B", "S", "D", "SG", "OBGL", "G", 'T', "O", "I"]
first_sizes = [2000, 300, 200, 100, 100, 150, 40, 30, 700]
second_sizes = [1000, 200, 200, 400, 500, 40, 1, 1, 1000]
third_sizes = [500, 300, 400, 500, 400, 100, 5, 2, 800]
flatui = (sns.diverging_palette(20, 250, n=8))
bigger = plt.pie(first_sizes, labels=first_labels, colors=flatui,
startangle=90, frame=True, radius = 1)
smaller = plt.pie(second_sizes,
colors=flatui, radius=0.9,
startangle=90, labeldistance=0.9)
smallest = plt.pie(third_sizes,
colors=flatui, radius=0.8,
startangle=90, labeldistance=0.8)
centre_circle = plt.Circle((0, 0), 0.7, color='white', linewidth=0)
fig = plt.gcf()
fig.gca().add_artist(centre_circle)
plt.axis('equal')
plt.tight_layout()
plt.show()
有人可以建议如何 "prettify" 饼图吗?
来自 documentation of plt.pie and this page:
[...] wedgeprops : dict, optional, default: None Dict of arguments passed to the wedge objects making the pie. For example, you can pass in wedgeprops = {'linewidth': 3} to set the width of the wedge border lines equal to 3. For more details, look at the doc/arguments of the wedge object. By default clip_on=False. [...]
您可以通过将名为 wedgeprops
的字典提供给您的饼图来自定义楔形。例如:
[...] repeating your code [...]
bigger = plt.pie(first_sizes, labels=first_labels, colors=flatui,
startangle=90, frame=True, radius = 1,
wedgeprops={'edgecolor':'k'})
smaller = plt.pie(second_sizes,
colors=flatui, radius=0.9,
startangle=90, labeldistance=0.9,
wedgeprops={'edgecolor':'k'})
smallest = plt.pie(third_sizes,
colors=flatui, radius=0.8,
startangle=90, labeldistance=0.8,
wedgeprops={'edgecolor':'k'})
centre_circle = plt.Circle((0, 0), 0.7, color='white', linewidth=0)
fig = plt.gcf()
fig.gca().add_artist(centre_circle)
# add legend to current ax:
plt.gca().legend(loc='center right', bbox_to_anchor=(1,0,0.5,0.5))
如果您只想要图例中的标签而不是绘图中的标签:
# make first pie without labels:
bigger = plt.pie(first_sizes, colors=flatui,
startangle=90, frame=True, radius = 1,
wedgeprops={'edgecolor':'k'})
# feed labels to legend:
plt.gca().legend(first_labels, loc='center right', bbox_to_anchor=(1,0,0.5,0.5))