让我们首先关注您的字典。每个键都与一个列表相关联,该列表最多可以包含两个元素。当你执行下面这段代码时,
dictionary = {
'Product Name 1' : [10.99,20.99],
'Product Name 2' : [50.99,10.99],
'Product Name 3' : [40.00,15.99],
'Product Name 4' : [50.00],
'Product Name 5' : [50.00]
}
print(dictionary.values())
# dict_values([[10.99, 20.99], [50.99, 10.99], [40.0, 15.99], [50.0], [50.0]])
您可以看到输出采用子列表列表的形式,每个子列表包含与特定键关联的值。但是,并非所有列表都具有相同的长度。这是一个问题,因为您想将列表转换为 numpy 数组。实际上,您不能生成尺寸不一致的数组。结果,您会得到一个 dtype object 的数组,它只是像以前一样存储子列表。
import numpy as np
print(np.array([x for x in dictionary.values()]))
print(np.array([x for x in dictionary.values()]).dtype)
# [list([10.99, 20.99]) list([50.99, 10.99]) list([40.0, 15.99])
# list([50.0]) list([50.0])]
# object
这就是为什么当你尝试对你的 numpy 数组进行切片时得到一个 IndexError 的原因,因为你根本做不到。我在下面提出一个解决方案。键和值是使用列表推导式收集的。生成了两个条形图,一个用于原始字典列表中的每个潜在条目。对于每个条形图,条形的高度是使用列表推导确定的。第一个只是获取列表的第一项。如果存在,则第二个获取第二个项目,否则,它使用 0。最后,更新 X 轴上的刻度以反映字典键。
import matplotlib.pyplot as plt
import numpy as np
dictionary = {
'Product Name 1' : [10.99,20.99],
'Product Name 2' : [50.99,10.99],
'Product Name 3' : [40.00,15.99],
'Product Name 4' : [50.00],
'Product Name 5' : [50.00]
}
keys = [key for key in dictionary.keys()]
values = [value for value in dictionary.values()]
fig, ax = plt.subplots()
ax.bar(np.arange(len(keys)) - 0.2, [value[0] for value in values],
width=0.2, color='b', align='center')
ax.bar(np.arange(len(keys)) + 0.2,
[value[1] if len(value) == 2 else 0 for value in values],
width=0.2, color='g', align='center')
ax.set_xticklabels(keys)
ax.set_xticks(np.arange(len(keys)))
plt.show()