Значения аннотации для горизонтальной панели в пандах - PullRequest
0 голосов
/ 24 декабря 2018

Я пытаюсь комментировать значения для горизонтальной столбчатой ​​диаграммы, созданной с помощью панд.Текущий код ниже

import pandas as pd 
import matplotlib.pyplot as plt
import numpy as np

d = {'group 1': [1, 2, 5, 7, 4, 5, 10],
     'group 2': [5, 6, 1, 8, 2, 6, 2],
     'group 3': [12, 2, 2, 4, 4, 8, 4]}
df = pd.DataFrame(d)

ax = df.plot.barh(stacked=True, figsize=(10,12))

for p in ax.patches:
    ax.annotate(str(p.get_x()), xy=(p.get_x(), p.get_y()+0.2))

plt.legend(bbox_to_anchor=(0, -0.15), loc=3, prop={'size': 14}, frameon=False)

Проблема заключается в том, что метод аннотации, который я использовал, дает x начальных точек, а не значения каждого сегмента.Я хотел бы иметь возможность аннотировать значения каждого сегмента в центре каждого сегмента для каждого из столбцов.

пример

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

введите описание изображения здесь

Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

Другое возможное решение - получить df.values в массив данных с помощью values = df.values.flatten("F")

%matplotlib inline
import pandas as pd 
import matplotlib.pyplot as plt
import numpy as np

d = {'group 1': [1, 2, 5, 7, 4, 5, 10],
     'group 2': [5, 6, 1, 8, 2, 6, 2],
     'group 3': [12, 2, 2, 4, 4, 8, 4]}
df = pd.DataFrame(d)

ax = df.plot.barh(stacked=True, figsize=(10,12))

values = df.values.flatten("F")

for i, p in enumerate(ax.patches):
    ax.annotate(str(values[i]), xy=(p.get_x()+ values[i]/2, p.get_y()+0.2))

plt.legend(bbox_to_anchor=(0, -0.15), loc=3, prop={'size': 14}, frameon=False);

enter image description here

0 голосов
/ 24 декабря 2018

Вы можете использовать патчи bbox для получения необходимой информации.

ax = df.plot.barh(stacked=True, figsize=(10, 12))
for p in ax.patches:
    left, bottom, width, height = p.get_bbox().bounds
    ax.annotate(str(width), xy=(left+width/2, bottom+height/2), 
                ha='center', va='center')

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...