将标签移动到 matplotlib 饼图中楔形的开头

问题描述 投票:0回答:1

我想将饼图中的标签从中心移动到每个楔形的开头:

import matplotlib.pyplot as plt
 
# Setting labels for items in Chart
Employee = ['A', 'B', 'C',
            'D', 'E']
 
# Setting size in Chart based on 
# given values
Salary = [40000, 50000, 70000, 54000, 44000]
 
# colors
colors = ['#FF0000', '#0000FF', '#FFFF00', 
          '#ADFF2F', '#FFA500']
fig, ax = plt.subplots(figsize=(5,5), facecolor = "#FFFFFF")
# Pie Chart
wedges, texts = ax.pie(Salary, colors=colors, 
        labels=Employee, labeldistance=0.8,
        wedgeprops=dict(width=0.35),)

我能够获取标签的坐标并将其替换为:

for lbl,p in zip(Employee,texts, ):
        x, y = p.get_position()
        print(x,y,p)
        ax.annotate(lbl, xy=(x,y),  size=12, color = "w")

但我不知道如何移动它们以跟随圆圈。

我还可以通过调用 wedges 属性来获取每个楔形的起始角度,但由于饼图是在笛卡尔轴而不是极坐标轴上绘制的,所以我也不知道该怎么做?

我不能为此使用 barh (我的图表比此处显示的更复杂)。

这可能吗?

这是我想要放置标签的地方。

python matplotlib
1个回答
0
投票

您可以根据楔形的属性自行计算标签的位置:

wedges, texts = ax.pie(Salary, colors=colors, 
        #labels=Employee, labeldistance=0.8,
        wedgeprops=dict(width=0.35),)

for lbl, w in zip(Employee, wedges):
    angle = w.theta2-10
    r = 0.8
    print(lbl, angle, np.deg2rad(angle))
    x = r*np.cos(np.deg2rad(angle))
    y = r*np.sin(np.deg2rad(angle))
    ax.annotate(lbl, xy=(x,y), size=12, color='w',
                ha='center', va='center', weight='bold')

输出:

© www.soinside.com 2019 - 2024. All rights reserved.