【问题标题】:Build a bar chart from a dictionary with list as values从字典中以列表为值构建条形图
【发布时间】:2020-02-07 05:58:18
【问题描述】:

如果这是一个菜鸟问题,我提前道歉(我第一次尝试 matpotlib)。 我有一本长度约为 70 的字典,其值是最大长度为 2 的元素的列表,例如:

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]
}

我已经尝试了以下代码:

import matplotlib.pyplot as plt
import numpy as np

c = []
v = []  

for key, val in dictionary.items():
    c.append(key)
    v.append(val)
v = np.array(v)

plt.bar(range(len(c)), v[:,0])
plt.bar(range(len(c)), v[:,1], bottom=v[:,0])
plt.xticks(range(len(c)), c)
plt.show()

当 plt.bar 时出现索引错误,数组索引过多。

【问题讨论】:

    标签: arrays python-3.x dictionary matplotlib


    【解决方案1】:

    让我们首先关注您的字典。每个键都与一个列表相关联,该列表最多可以包含两个元素。当你执行下面这段代码时,

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-26
      • 2015-09-25
      • 2015-06-30
      • 2013-05-27
      • 1970-01-01
      • 1970-01-01
      • 2019-07-28
      相关资源
      最近更新 更多