使用文件中的输入来定义绘图中的条形颜色(matplotlib)

时间:2016-01-27 16:24:50

标签: python matplotlib

我正在尝试使用.csv文件的输入来绘制条形图。

我的输入文件包含几个包含样本名称和数据的列,以及一个包含我的样本颜色的列。此列包含字符串,例如'w'表示白色,'b'表示棕色等等。每行包含不同样本的值。

现在我希望每个样本的条形图都具有颜色列中指定的颜色。

我的代码看起来有点像这样:

 SELECT ...
 CAST(CASE COL.Reason WHEN 'Service Fault' THEN 2 WHEN 'Program Fault' THEN 9 END as smallint)  as Category
 WHERE ... ORDER BY ....;

我收到的错误消息如下:

  

不可用类型:'numpy.ndarray'(指向plt.bar(...)行)。

听起来我正在以错误的方式或者某些东西调用字典,但我无法弄清楚如何正确地做到这一点。

我希望,这可以解释我正在尝试做什么。

1 个答案:

答案 0 :(得分:2)

Python的dict只能用一个键索引。他们不允许“矢量化”索引。

让我们使用一个给出相同错误的简化示例:

import numpy as np

lookup = {'a':1, 'b':2, 'c':3}
values = np.array(['a', 'b', 'c', 'c', 'a', 'b', 'a'])
data = lookup[values]

哪个收益率:

TypeError                                 Traceback (most recent call last)
<ipython-input-71-7d8663a08b8d> in <module>()
      1 lookup = {'a':1, 'b':2, 'c':3}
      2 values = np.array(['a', 'b', 'c', 'c', 'a', 'b', 'a'])
----> 3 data = lookup[values]

TypeError: unhashable type: 'numpy.ndarray'

确切的错误是因为我们试图使用可变类型作为dict的键。有些序列(例如tuple s)可以用作键,但它们仍然无法按照您希望的方式工作。

因此,您不需要使用data = lookup[values]等一系列键,而是需要使用列表解析:

data = [lookup[item] for item in values]

将其重新放回原始示例:

import numpy as np
import matplotlib.pyplot as plt

results_dtype=np.dtype([('name', 'S100'), ('colour', 'S10'),
('data_this', 'float64'), ('data_that', 'float64'), ...])


data = np.genfromtxt('C:/data.csv', delimiter = ',', dtype=results_dtype, 
                     filling_values=np.nan, skip_header=1)

colours = {'w':'#FFFFFF',
           'y':'#ffff00',
           'b':'#cc8033',
           'p':'#CC79A7'}

color = [colours[item] for item in data['colour']]

fig = plt.figure()
plt.bar(np.arange(len(data)), data['data_this'], bottom=data['data_that'],  
        align='center', color=color)
plt.xticks(np.arange(len(data)), data['name'], rotation='vertical')
plt.show()