【问题标题】:How to determine the order of bars in a matplotlib bar chart如何确定 matplotlib 条形图中条形的顺序
【发布时间】:2013-12-31 04:08:36
【问题描述】:

假设我们将一些数据读入 pandas 数据框:

data1 = pd.read_csv("data.csv", "\t")

内容如下:

然后定义一个函数,它应该给我们一个水平条形图,其中条形长度表示值,条形用键标记。

def barchart(data, labels):
    pos = arange(len(data))+.5    # the bar centers on the y axis
    barh(pos, data, align='center', height=0.25)
    yticks(pos, labels)

然后我们这样调用绘图函数:

barchart(data1["val"], data1["key"])

这给了我们以下情节:

现在,什么决定了条形的顺序?

假设我们希望条形图按特殊顺序排列,比如[C, A, D, F, E, B],我们该如何执行?

【问题讨论】:

  • 只需重新排序您的输入。
  • @tcaswell 如何按列表重新排序输入[C, A, D, F, E, B]
  • @cls barchart(data[['C', 'A', 'D', 'F', 'E', 'B']], labels)
  • data[['C', 'A', 'D', 'F', 'E', 'B']] -- 不行,这样你可以选择列

标签: python matplotlib plot pandas


【解决方案1】:

如果直接用

读取key作为索引
In [12]: df = pd.read_csv('data.csv', '\t', index_col='key')

In [13]: df
Out[13]: 
     val
key     
A    0.1
B    0.4
C    0.3
D    0.5
E    0.2

您可以使用ix 以不同的顺序获取索引并使用df.plot 绘制它:

In [14]: df.ix[list('CADFEB')].plot(kind='barh')
Out[14]: <matplotlib.axes._subplots.AxesSubplot at 0x530fa90>

(注意数据中没有给出F,但你给了它作为例子)

【讨论】:

【解决方案2】:

我修改了原始版本的条形图。要指定条形的顺序,我使用通过 ii 列设置的索引:

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

def barchart(data, labels):
    pos = np.arange(len(data)) + 0.5  # the bar centers on the y axis
    plt.barh(pos, data.sort_index(), align='center', height=0.25)
    plt.yticks(pos, labels.sort_index())

data1 = pd.DataFrame({'key': list('ABCDE'), 'val': np.random.randn(5)})

new_keys = list('EDACB')
data1['ii'] = [new_keys.index(x) for x in data1.key]

data1 = data1.set_index('ii')
barchart(data1["val"], data1["key"])
plt.show()

【讨论】:

  • 如何从有序的键列表中自动生成data['ii‘] 列?
  • 我编辑答案以显示如何生成数据['ii'] 列。也看看下面bmu的答案,真的很整洁。
猜你喜欢
  • 2014-05-03
  • 1970-01-01
  • 2018-03-16
  • 2018-02-07
  • 1970-01-01
  • 2018-08-22
  • 2019-02-19
  • 2020-08-24
相关资源
最近更新 更多