如何根据贡献值在pyplot饼图中显示过滤后的图例标签?
How to show filtered legend labels in pyplot pie chart based on the values of contributions?
我想绘制一个饼图,显示超过 1% 的贡献及其相应的图例标签。
我已经设法在饼图上显示了我想要的百分比值(参见下面的脚本),但没有显示图例标签。在下面的示例中,我想显示图例标签 ABCD,而不是 EF。
我已经尝试了几种方法,但只能显示完整的图例或具有不匹配(错误)颜色的过滤图例。
我该怎么做?有人可以帮忙吗?谢谢
sizes = pd.DataFrame([80,10,5,4,0.1,0.9],index=list("ABCDEF"))
fig1, ax2 = plt.subplots()
def autopct_more_than_1(pct):
return ('%1.f%%' % pct) if pct > 1 else ''
ax2.pie(sizes.values, autopct=autopct_more_than_1)
ax2.axis('equal')
plt.legend(sizes.index, loc="best", bbox_to_anchor=(1,1))
plt.show()
您可以遍历数据帧值(如果它们尚未标准化,则可能已标准化),并且只采用大于 1 的图例句柄和标签。
import matplotlib.pyplot as plt
import pandas as pd
sizes = pd.DataFrame([80,10,5,4,0.1,0.9],index=list("ABCDEF"))
fig1, ax = plt.subplots()
def autopct_more_than_1(pct):
return ('%1.f%%' % pct) if pct > 1 else ''
p,t,a = ax.pie(sizes.values, autopct=autopct_more_than_1)
ax.axis('equal')
# normalize dataframe (not actually needed here, but for general case)
normsizes = sizes/sizes.sum()*100
# create handles and labels for legend, take only those where value is > 1
h,l = zip(*[(h,lab) for h,lab,i in zip(p,sizes.index.values,normsizes.values) if i > 1])
ax.legend(h, l,loc="best", bbox_to_anchor=(1,1))
plt.show()
我想绘制一个饼图,显示超过 1% 的贡献及其相应的图例标签。
我已经设法在饼图上显示了我想要的百分比值(参见下面的脚本),但没有显示图例标签。在下面的示例中,我想显示图例标签 ABCD,而不是 EF。
我已经尝试了几种方法,但只能显示完整的图例或具有不匹配(错误)颜色的过滤图例。
我该怎么做?有人可以帮忙吗?谢谢
sizes = pd.DataFrame([80,10,5,4,0.1,0.9],index=list("ABCDEF"))
fig1, ax2 = plt.subplots()
def autopct_more_than_1(pct):
return ('%1.f%%' % pct) if pct > 1 else ''
ax2.pie(sizes.values, autopct=autopct_more_than_1)
ax2.axis('equal')
plt.legend(sizes.index, loc="best", bbox_to_anchor=(1,1))
plt.show()
您可以遍历数据帧值(如果它们尚未标准化,则可能已标准化),并且只采用大于 1 的图例句柄和标签。
import matplotlib.pyplot as plt
import pandas as pd
sizes = pd.DataFrame([80,10,5,4,0.1,0.9],index=list("ABCDEF"))
fig1, ax = plt.subplots()
def autopct_more_than_1(pct):
return ('%1.f%%' % pct) if pct > 1 else ''
p,t,a = ax.pie(sizes.values, autopct=autopct_more_than_1)
ax.axis('equal')
# normalize dataframe (not actually needed here, but for general case)
normsizes = sizes/sizes.sum()*100
# create handles and labels for legend, take only those where value is > 1
h,l = zip(*[(h,lab) for h,lab,i in zip(p,sizes.index.values,normsizes.values) if i > 1])
ax.legend(h, l,loc="best", bbox_to_anchor=(1,1))
plt.show()