【问题标题】:Python: draw multiple positive/negative Bar Charts by conditionsPython:按条件绘制多个正/负条形图
【发布时间】:2019-05-28 18:24:15
【问题描述】:

这是我第一次在 python 中绘制条形图。

我的 df 操作:

      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')

输出:

但这不是我所期望的。在这种情况下,我想用不同的键绘制两个图表,并可能使用不同的颜色,如下所示:

我怎样才能做到这一点?

【问题讨论】:

  • 数据输入错误? “面条”与“面条”?
  • @ScottBoston 是的,这是一个错字:)

标签: python matplotlib bar-chart


【解决方案1】:

试试:

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

输出:

更新添加了 yaxis 的标签移动 - 感谢SO solution by @ 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

输出:

【讨论】:

  • 尝试找到一种方法将那些 yaxis 刻度标签移到上面,这样您就不会在栏中出现“分数”和“颜色”。我明天再看看这个。也许这里的 matplotlib 向导之一可以修改和移动该文本。
  • 非常整洁!谢谢 :) 没有必要有 yaxis 刻度标签,所以我只是隐藏它。我有一个问题,当我尝试绘制条形图时,我实际上有 100 多个唯一键。我将子图从 (1,op.key.nunique()) 更改为 (op.key.nunique(),1) 并更改 figsize 但图表非常混乱,因为它们太小并且粘在一起。我该如何解决这个问题?我只希望每张照片都和你的一样大。
  • @cherrytree1 您将不得不调整图形的大小以垂直容纳 100 个图像。您的无花果大小是图表的总大小,包括所有 100 个子图。我你在最后尝试使用 figsize=(15, 500) plt.tight_layout()
  • 抱歉又打扰了。当我今天尝试代码时,不知道为什么它不能正确显示颜色。今天试的时候全是红色的。
  • 升级 matplotlib 和 pandas
猜你喜欢
  • 2020-09-15
  • 1970-01-01
  • 1970-01-01
  • 2020-07-22
  • 1970-01-01
  • 2019-06-09
  • 2021-10-07
  • 2021-11-03
相关资源
最近更新 更多