我有一個由以下代碼生成的餅圖,將標簽擠向頂部。有沒有更好的方法來添加標簽和箭頭,以免重疊?我不能使用圖例;我需要標簽在每個切片旁邊。
我知道在 excel 中有一個“最適合”選項可以解決這樣的問題(
uj5u.com熱心網友回復:
我們不會討論它是否適合可視化。假設注釋的順序可以不同,我們可以將數字重新排序為大小的順序,并相應地更改標簽的順序。這種方法取決于資料并且可能僅限于此任務。可能有一種更智能的方法來重新排序資料。
import matplotlib.pyplot as plt
import numpy as np
bbox_props=dict(boxstyle='square,pad=0.3',fc ='w',ec='k',lw=0.72)
kw=dict(xycoords='data',textcoords='data',arrowprops=dict(arrowstyle='-'),zorder=0,va='center')
fig1,ax1=plt.subplots()
labels=["first\n1.8%","second\n1.3%","third\n10.5%","fourth\n13.8%","fifth\n7.8%","sixth\n6.7%","seventh\n9.9%","eighth\n12.2%","ninth\n12.7%","tenth\n10.9%","eleventh\n7.6%","twelfth\n4.8%"]
values=[1.8,1.3,10.5,13.8,7.8,6.7,9.9,12.2,12.7,10.9,7.6,4.8]
# Add code
annotate_dict = {k:v for k,v in zip(labels, values)}
val = [[x,y] for x,y in zip(sorted(values, reverse=True),sorted(values))]
values1 = sum(val, [])
new_labels = []
for v in values1[:len(values)]:
for key, value in annotate_dict.items():
if v == value:
new_labels.append(key)
wedges,texts=ax1.pie(values1[:len(values)],explode=[0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01],labeldistance=1.2,startangle=90)
for i,p in enumerate(wedges):
ang=(p.theta2-p.theta1)/2. p.theta1
y=np.sin(np.deg2rad(ang))
x=np.cos(np.deg2rad(ang))
horizontalalignment={-1:"right",1:"left"}[int(np.sign(x))]
connectionstyle="angle,angleA=0,angleB={}".format(ang)
kw["arrowprops"].update({"connectionstyle":connectionstyle})
ax1.annotate(new_labels[i],xy=(x, y),xytext=(1.35*np.sign(x),1.4*y),
horizontalalignment=horizontalalignment,**kw)
plt.show()

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/374590.html
標籤:Python matplotlib 饼形图
