Python: нарисуйте несколько положительных / отрицательных гистограмм по условиям - PullRequest
0 голосов
/ 02 января 2019

Я впервые рисую гистограммы в Python.

Моя операционная система:

      key descript  score
0  noodles    taste      5
1  noodles    color     -2
2  noodles   health      3
3   apple    color      7
4   apple    hard      9

Мой код:

import matplotlib.pyplot as plt
op['positive'] = op['score'] > 0
op['score'].plot(kind='barh', color=op.positive.map({True: 'r', False: 'k'}), use_index=True)
plt.show()
plt.savefig('sample1.png')

Вывод:

Bar Chart

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

expected Bar Chart

Как мне это сделать?

1 Ответ

0 голосов
/ 02 января 2019

Попробуйте:

fig, ax = plt.subplots(1,op.key.nunique(), figsize=(15,5), sharex=True)
i = 0

#Fix some data issues/typos
op['key']=op.key.str.replace('noodels','noodles')

for n, g in op.assign(positive=op['score'] >= 0).groupby('key'):
    g.plot.barh(y='score', x='descript', ax=ax[i], color=g['positive'].map({True:'red',False:'blue'}), legend=False)\
    .set_xlabel(n)
    ax[i].set_ylabel('Score')
    ax[i].spines['top'].set_visible(False)
    ax[i].spines['right'].set_visible(False)
    ax[i].spines['top'].set_visible(False)
    ax[i].spines['left'].set_position('zero')
    i += 1

Вывод:

enter image description here

Обновление добавлено перемещение меток для яксис - благодаря этому SO решение от @ ImportanceOfBeingErnest

fig, ax = plt.subplots(1,op.key.nunique(), figsize=(15,5), sharex=True)
i = 0

#Fix some data issues/typos
op['key']=op.key.str.replace('noodels','noodles')

for n, g in op.assign(positive=op['score'] >= 0).groupby('key'):
    g.plot.barh(y='score', x='descript', ax=ax[i], color=g['positive'].map({True:'red',False:'blue'}), legend=False)\
    .set_xlabel(n)
    ax[i].set_ylabel('Score')
    ax[i].spines['top'].set_visible(False)
    ax[i].spines['right'].set_visible(False)
    ax[i].spines['top'].set_visible(False)
    ax[i].spines['left'].set_position('zero')
    plt.setp(ax[i].get_yticklabels(), transform=ax[i].get_yaxis_transform())
    i += 1

Вывод:

enter image description here

...