Pandas гистограмма с неравными группами - PullRequest
2 голосов
/ 22 января 2020

У меня есть данные с иерархической структурой, и я хочу создать график с группами баров.

import pandas as pd

data = [
 ['alpha', 'x', 1],
 ['alpha', 'y', 2],
 ['alpha', 'z', 2],
 ['beta', 'x', 3],
 ['beta', 'z', 4]]

df = pd.DataFrame(data, columns=['P','Q','R'])
df.pivot('P','Q','R').plot.bar(rot=0)

Этот код выдает:

code output

Как я мог:

  1. Устранить место для отсутствующего бара, т.е. разместить группы с разным количеством баров?
  2. Сделать все альфы синими и бета-апельсинами , то есть циклические цвета по группам, а не внутри групп?

Ответы [ 3 ]

2 голосов
/ 22 января 2020

Что если вы создадите сюжет "вручную"? Вы можете использовать loc для фильтрации. Затем нарисуйте на том же рисунке.

волхвы c для пространства происходит с использованием значений индекса. обратите внимание на beta Я добавляю +1 к индексу, чтобы создать это дополнительное пространство. Затем я объединяю оба индекса в xticks, а затем просто использую df['Q'] в качестве меток.

plt.bar(data=df.loc[df['P']=='alpha'], x=df.loc[df['P']=='alpha'].index, height='R', label='alpha')
plt.bar(data=df.loc[df['P']=='beta'], x=df.loc[df['P']=='beta'].index+1, height='R', label='beta')
plt.xticks(df.loc[df['P']=='alpha'].index.tolist() + list(df.loc[df['P']=='beta'].index+1),df['Q'].tolist())

plt.legend()

enter image description here

1 голос
/ 22 января 2020

Это вдохновлено ответом @ MattR, который показал мне, что построение баров с нуля - это не ракетостроение. Pandas groupby() кажется хорошим инструментом для этого.

В конце я предпочитаю это без лишнего пробела между группами.

    labels = []
    for g, grp in df.groupby('P'):
        plt.bar(grp.index, grp.R, label=g)
        labels.extend(grp.Q)
    plt.xticks(df.index, labels)
    plt.legend()

enter image description here

0 голосов
/ 22 января 2020

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

import pandas as pd

data = [
 ['alpha', 'x', 1],
 ['alpha', 'y', 2],
 ['alpha', 'z', 2],
 ['beta', 'x', 3],
 ['beta', 'z', 4]]

df =  pd.DataFrame(data, columns=['P','Q','R'])
df.pivot('P','Q','R').plot.bar(rot=0, stacked=True,color = ['blue', 'green', 'red'])

enter image description here

Надеюсь, это поможет.

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