从字典绘制直方图 Python

-2 投票
1 回答
3240 浏览
提问于 2025-04-18 07:25

我有一个字典,每个键都有一个对应的值。

我想用 matplotlib 把这个字典画成一个柱状图,给每根柱子设置不同的颜色,并且找到一种方法,让长字符串作为清晰的标签。

X = np.arange(len(dictionay))
pl.bar(X, dictionay.values(), align='center', width=0.5)
pl.xticks(X, dictionay.keys())
pl.xticks(rotation=20)
ymax = max(dictionay.values()) + 1
pl.ylim(0, ymax)
pl.show()

结果是:

丑陋的图表显示不想要的行为

我的键很长,所以我们看得不太清楚!而且,如果能按 y 值排序的话就更好了。我知道字典不能排序,那我可以用列表吗?

有什么想法吗?

谢谢

1 个回答

2

我想用matplotlib来绘制这个字典,给每个键设置不同的颜色,并且找到一种方法来绘制那些很长的字符串作为键……另外,如果能把这个图表排序就更好了。

可惜的是,我找到的处理长字符串的最好方法就是把它们截断。我随便选择了15个字符作为最大长度,你可以根据自己的需要选择合适的长度。

下面的代码定义了一个字典(Dictionary),创建了一个按值从大到小排序的键和对应值的列表,并且截断那些显示不好的长键。当绘制条形图时,是一个一个条形绘制的,这样就可以为每个条形设置不同的颜色。颜色是通过遍历一开始定义的元组(Colors)来选择的。

import numpy as np
import matplotlib.pyplot as plt

Dictionary = {"A":3,"C":5,"B":2,"D":3,"E":4,
              "A very long key that will be truncated when it is graphed":1}
Dictionary_Length = len(Dictionary)
Max_Key_Length = 15
Sorted_Dict_Values = sorted(Dictionary.values(), reverse=True)
Sorted_Dict_Keys = sorted(Dictionary, key=Dictionary.get, reverse=True)
for i in range(0,Dictionary_Length):
    Key = Sorted_Dict_Keys[i]
    Key = Key[:Max_Key_Length]
    Sorted_Dict_Keys[i] = Key
X = np.arange(Dictionary_Length)
Colors = ('b','g','r','c')  # blue, green, red, cyan

Figure = plt.figure()
Axis = Figure.add_subplot(1,1,1)
for i in range(0,Dictionary_Length):
    Axis.bar(X[i], Sorted_Dict_Values[i], align='center',width=0.5, color=Colors[i%len(Colors)])

Axis.set_xticks(X)
xtickNames = Axis.set_xticklabels(Sorted_Dict_Keys)
plt.setp(Sorted_Dict_Keys)
plt.xticks(rotation=20)
ymax = max(Sorted_Dict_Values) + 1
plt.ylim(0,ymax)

plt.show()

输出图表:

输出图表

撰写回答