Перекрывающиеся метки в диаграмме matplotlib p ie - PullRequest
0 голосов
/ 08 апреля 2020

Я хочу построить график ap ie, однако мои метки продолжают перекрываться (у меня есть один большой и десять маленьких клиньев). После некоторого исследования я наткнулся на ответ на подобный вопрос , однако он не работает для меня, это вывод: enter image description here

Есть ли способ надежного аннотирования моей диаграммы p ie таким образом, чтобы метки не перекрывались и не частично пересекались с самой таблицей p ie?

Это мой код:

import matplotlib.pyplot as plt
import math

labels = ["one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven"]
fig, ax = plt.subplots()
values = [574.51,
 272.3333,
 250.0,
 221.0,
 164.0,
 135.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"
    va = "bottom"

    if angle > 90:
        angle -= 180

    if angle < 0:
        va = "top"

    if -45 <= angle <= 0:
        ha = "right"
        va = "bottom"

    plt.annotate(label, xy=(x,y), rotation=angle, ha=ha, va=va, size=8)

1 Ответ

1 голос
/ 08 апреля 2020

Внесение нескольких изменений поможет в этом (и в конечном итоге это будет легче, чем у вас): 1) используйте x, чтобы решить, находится ли он слева или справа по графику, что не обязательно, но это менее запутанный, чем углы; 2) используйте rotation_mode = "anchor", чтобы выравнивание произошло до поворота; 3) поверните с va = "center".

Вот как выглядит вывод для меня (где я изменил значения данных, чтобы я мог продемонстрировать выравнивание во всех квадрантах).

enter image description here

И код:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...