Matplotlib饼图:水平旋转标签

4
使用matplot创建一个小的仪表盘,如下所示的代码:
    group_size=[10,10,10,10,10,50]
    labels=['AAAA','BBBB','CCCC','DDDD','EEEE','']
    fig, ax = plt.subplots()
    ax.axis('equal')
    pie = ax.pie(group_size, radius=2.2, colors=['k'] ,startangle=180,counterclock=False)
    pie2 = ax.pie([10,10,10,10,10,50], radius=2,  labeldistance=0.7, labels=labels, rotatelabels = 270,
startangle=180,counterclock=False)
    plt.show()

我想让标签水平排列,并与每个楔形图的中点对齐,如下所示(但文本应位于楔形图内):
使用rotatelabel=True,我得到以下结果:
有什么办法可以实现标签在图表中的水平旋转?
2个回答

8

您需要手动旋转饼图标签。为此,您可以循环遍历标签并根据需要设置旋转。

group_size=[10,10,10,10,10,50]
labels=['AAAA','BBBB','CCCC','DDDD','EEEE','']
fig, ax = plt.subplots()
ax.axis('equal')
pie = ax.pie(group_size, radius=2.2, colors=['k'] ,startangle=180,counterclock=False)
pie2 = ax.pie([10,10,10,10,10,50], radius=2,  labeldistance=0.9, labels=labels, 
              rotatelabels =True, startangle=180,counterclock=False)

plt.setp(pie2[1], rotation_mode="anchor", ha="center", va="center")
for tx in pie2[1]:
    rot = tx.get_rotation()
    tx.set_rotation(rot+90+(1-rot//180)*180)

plt.show()

enter image description here


非常有帮助的答案。简短的问题:为什么 plt.setp(pie, width=0.3, edgecolor='white') 会返回 TypeError: Axes.pie() got an unexpected keyword argument 'linecolor' - Stücke
我该如何像这个例子https://dev59.com/mbLma4cB1Zd3GeqPea3I中所做的那样更改行颜色? - Stücke

3

我的解决方案基本上与ImportanceOfBeingErnest的被接受答案相似。但我认为所涉及的步骤更容易理解。

import matplotlib.pyplot as plt

group_size = [10, 10, 10, 10, 10, 50]
labels = ['AAAA', 'BBBB', 'CCCC', 'DDDD', 'EEEE', '']
fig, ax = plt.subplots()
ax.axis('equal')
pie = ax.pie(group_size, radius=2.2, colors=['k'], startangle=180, counterclock=False)

# ax.pie() returns wedges, labels
# Note that rotatelabels=False; so that, at this step ...
# all labels are not rotated; they will be rotated later
wedges, labels = ax.pie([10, 10, 10, 10, 10, 50], radius=2,  \
                      labeldistance=0.85, labels=labels, rotatelabels = False, \
                      startangle=180, counterclock=False)

# do the rotation of the labels
for ea, eb in zip(wedges, labels):
    mang =(ea.theta1 + ea.theta2)/2.  # get mean_angle of the wedge
    #print(mang, eb.get_rotation())
    eb.set_rotation(mang+270)         # rotate the label by (mean_angle + 270)
    eb.set_va("center")
    eb.set_ha("center")

plt.show()

生成的图片: 在这里输入图片描述

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接