调出饼图matplotlib中重叠的标签

2024-05-08 03:44:09 发布

您现在位置:Python中文网/ 问答频道 /正文

enter image description here我有需要绘制的数据,但标签重叠。我不知道如何使标签正确地可视化。这是我的密码:

items = [['#024260', 'LOA', '2.805757227344012e-06'],
         ['#8d5af7', 'MF', '4.971738496305904e-05'],
         ['#e34045', 'BND', '9.983376434507252e-05'],
         ['#f19437', 'CASH', '0.00019645638525306184'],
         ['#17B5C9', 'ETF', '0.000709395584554212'],
         ['#f85e54', 'STP', '0.0013873917477135414'],
         ['#88124F', 'PRF', '0.0015986586552010882'],
         ['#ff3c83', 'UNT', '0.003807557052557499'],
         ['#f8da00', 'DR', '0.008560450377422474'],
         ['#4ce068', 'EQS', '0.972791941583156']]

可以看到,第一列是颜色代码。第2列是标记器,第3列是与字符串格式的标记器对应的值

items = np.array(sorted(items, key=lambda x: x[-1]))
#items = items[items[:,2].argsort()]
labels = items[:,1]
data = (items[:,2].astype(np.float) * 100).round(2)
#chartnum += 1
#path = plot_path + f"/chart-pie_{chartnum}.pdf"

mask = (data > 0) & (data <= 5)
explode = np.where(mask, 0.3,0)
labels = ['%s, %1.2f %%' % (l, float(s)) for l, s in zip(labels, data)]

fig, ax = plt.subplots(figsize=(9, 3))
#plt.gca().axis("equal")
explode = np.where(values > 0, 0.2, 0)
idx = np.argmax(data > 0)
#np.random.shuffle(data[idx:])
patches,texts = pie = ax.pie(data[idx:], colors=items[:,0][idx:],
    labeldistance=1.2, pctdistance=1.2, 
                        labels=list(map(lambda x: x, items[idx:,1])), startangle=angle,
                      radius=3,explode=explode[idx:])
bbox_props = dict(boxstyle="square,pad=0.3", fc="w", ec="k", lw=0.72)
arrowprops=dict(arrowstyle="-",connectionstyle="angle,angleA=0,angleB=90")
kw = dict(xycoords='data',textcoords='data',arrowprops=arrowprops, 
          bbox=bbox_props, zorder=0, va="center")

for i, p in enumerate(patches):
    ang = (p.theta2 - p.theta1)/2.+p.theta1
    y = np.sin(ang/180.*np.pi)
    x = 1.35*np.sign(np.cos(ang/180.*np.pi))
    plt.gca().annotate(str(1+i), xy=(0, 0), xytext=( x, y), **kw )
plt.legend(pie[0],labels, loc="center left", bbox_to_anchor=(2.5,0,0.5,1))
#ax.legend(patches,labels[idx:], bbox_to_anchor=(2.5,0,0.5,1), loc='center left',frameon=False)
#plt.tight_layout()[![enter image description here][1]][1]

正如你所看到的,我很难在没有重叠的情况下正确显示标签。如何解决此问题?谢谢


Tags: datalabelsnpitemsplt标签axdict