Matplotlib:饼图中的重叠标签
Matplotlib: Overlapping labels in pie chart
我必须为以下数据制作饼图:
但是,由于较大的数字以百为单位,而较小的数字小于 1,因此图表的标签由于重叠而变得难以辨认。例如,这是新加坡的图表:
我试过减小字体大小并增加图形大小,但因为它们重叠太多,所以这样做根本没有帮助。以下是我的图表所需的代码:
import matplotlib.pyplot as plt
plt.pie(consumption["Singapore"], labels = consumption.index)
fig = plt.gcf()
fig.set_size_inches(8,8)
ax = plt.gca()
handles, labels = ax.get_legend_handles_labels()
labels, handles = zip(*sorted(zip(labels, handles), key=lambda t: t[0], reverse=True))
plt.show()
有什么办法可以解决这个问题吗?
标签字符重叠的问题无法通过编程完全解决。如果您只处理挑战,请先将它们分组以汇总标签数量。分组的数据框针对饼图。但是还是重叠了,所以获取当前标签位置,改变重叠标签的位置。
new_df = consumption.groupby('Singapore')['Entity'].apply(list).reset_index()
new_df['Entity'] = new_df['Entity'].apply(lambda x: ','.join(x))
new_df
Singapore Entity
0 0.000000 Biofuels,Wind,Hydro,Nuclear
1 0.679398 Other
2 0.728067 Solar
3 5.463305 Coal
4 125.983605 Gas
5 815.027694 Oil
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(8,8))
wedges, texts = ax.pie(new_df["Singapore"], wedgeprops=dict(width=0.5), startangle=0, labels=new_df.Entity)
# print(wedges, texts)
texts[0].set_position((1.1,0.0))
texts[1].set_position((1.95,0.0))
texts[2].set_position((2.15,0.0))
plt.legend()
plt.show()
我必须为以下数据制作饼图:
但是,由于较大的数字以百为单位,而较小的数字小于 1,因此图表的标签由于重叠而变得难以辨认。例如,这是新加坡的图表:
我试过减小字体大小并增加图形大小,但因为它们重叠太多,所以这样做根本没有帮助。以下是我的图表所需的代码:
import matplotlib.pyplot as plt
plt.pie(consumption["Singapore"], labels = consumption.index)
fig = plt.gcf()
fig.set_size_inches(8,8)
ax = plt.gca()
handles, labels = ax.get_legend_handles_labels()
labels, handles = zip(*sorted(zip(labels, handles), key=lambda t: t[0], reverse=True))
plt.show()
有什么办法可以解决这个问题吗?
标签字符重叠的问题无法通过编程完全解决。如果您只处理挑战,请先将它们分组以汇总标签数量。分组的数据框针对饼图。但是还是重叠了,所以获取当前标签位置,改变重叠标签的位置。
new_df = consumption.groupby('Singapore')['Entity'].apply(list).reset_index()
new_df['Entity'] = new_df['Entity'].apply(lambda x: ','.join(x))
new_df
Singapore Entity
0 0.000000 Biofuels,Wind,Hydro,Nuclear
1 0.679398 Other
2 0.728067 Solar
3 5.463305 Coal
4 125.983605 Gas
5 815.027694 Oil
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(8,8))
wedges, texts = ax.pie(new_df["Singapore"], wedgeprops=dict(width=0.5), startangle=0, labels=new_df.Entity)
# print(wedges, texts)
texts[0].set_position((1.1,0.0))
texts[1].set_position((1.95,0.0))
texts[2].set_position((2.15,0.0))
plt.legend()
plt.show()