Внесение нескольких изменений поможет в этом (и в конечном итоге это будет легче, чем у вас): 1) используйте x
, чтобы решить, находится ли он слева или справа по графику, что не обязательно, но это менее запутанный, чем углы; 2) используйте rotation_mode = "anchor"
, чтобы выравнивание произошло до поворота; 3) поверните с va = "center"
.
Вот как выглядит вывод для меня (где я изменил значения данных, чтобы я мог продемонстрировать выравнивание во всех квадрантах).
![enter image description here](https://i.stack.imgur.com/5A6M0.png)
И код:
labels = ["one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven"]
fig, ax = plt.subplots()
values = [574.51,
272.3333,
1050.0,
221.0,
164.0,
935.0,
114.10000000000001,
112.31708,
100.0,
91.8,
2209.0827639999993]
l = ax.pie(values, startangle=-90)
for label, t in zip(labels, l[1]):
x, y = t.get_position()
angle = int(math.degrees(math.atan2(y, x)))
ha = "left"
if x<0:
angle -= 180
ha = "right"
plt.annotate(label, xy=(x,y), rotation=angle, ha=ha, va="center", rotation_mode="anchor", size=8)