我正在尝试使用.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(...)行)。
听起来我正在以错误的方式或者某些东西调用字典,但我无法弄清楚如何正确地做到这一点。
我希望,这可以解释我正在尝试做什么。
答案 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()