我有一个非常简单的分组条形图,有 5 组,每组 4 个条。我使用了 matplotlib documentation 中的示例,它是这样的:
import numpy as np
import matplotlib.pyplot as plt
ind = np.arange(5)
avg_bar1 = (81191,79318,57965,60557,14793)
avg_bar2 = (26826,26615,31364,31088,55472)
avg_bar3 = (36232,38038,38615,39014,40812)
avg_bar4 = (26115,25879,25887,28326,27988)
fig, ax = plt.subplots()
rects1 = ax.bar(ind, avg_bar1, 0.15, label='bar1')
rects2 = ax.bar(ind + 0.15, avg_bar2, 0.15, label='bar2')
rects3 = ax.bar(ind + 0.30, avg_bar3, 0.15, label='bar2')
rects4 = ax.bar(ind + 0.45, avg_bar4, 0.15, label='bar2')
plt.xlabel('Distributions')
plt.ylabel('ms')
plt.xticks(ind + 0.15, ('50/50', '60/40', '70/30', '80/20', '90/10'))
plt.legend()
plt.tight_layout()
plt.show()
问题
但是相应的其他组中的一些条值(例如 group1 中的 bar1 和 group2 中的 bar1 等)彼此相差不大。
我想要什么
所以我想添加线条,以便更清楚地看到每个组的趋势。这些线应该从一个组中每个栏的顶部到对应的其他组中栏的顶部。
我在网上找不到任何类似的东西。
这可能吗?
我最近开始学习Matplotlib和Numpy,发现你的问题很有趣。
因此,我花时间创建了分组条形图和与该分组条形图相关的折线图的组合图。
结果:
代码:
import numpy as np
import matplotlib.pyplot as plt
ind = np.arange(5)
avg_bar1 = (81191,79318,57965,60557,14793)
avg_bar2 = (26826,26615,31364,31088,55472)
avg_bar3 = (36232,38038,38615,39014,40812)
avg_bar4 = (26115,25879,25887,28326,27988)
rects1 = plt.bar(ind, avg_bar1, 0.15, color='#ff0000',label='bar1')
rects2 = plt.bar(ind + 0.15, avg_bar2, 0.15, color='#00ff00', label='bar2')
rects3 = plt.bar(ind + 0.30, avg_bar3, 0.15, color='#0000ff', label='bar3')
rects4 = plt.bar(ind + 0.45, avg_bar4, 0.15, color='#000000', label='bar4')
high_point_x = []
high_point_y = []
for i in range(0,5):
single_bar_group={rects1[i].get_height():rects1[i].get_x() + rects1[i].get_width()/2.0,
rects2[i].get_height():rects2[i].get_x() + rects2[i].get_width()/2.0,
rects3[i].get_height():rects3[i].get_x() + rects3[i].get_width()/2.0,
rects4[i].get_height():rects4[i].get_x() + rects4[i].get_width()/2.0}
height_list = list(single_bar_group.keys())
height_list.sort(reverse=True)
for single_height in height_list:
high_point_y.append(single_height)
high_point_x.append(single_bar_group[single_height])
break
trend_line = plt.plot(high_point_x,high_point_y,marker='o', color='#5b74a8', label='Trend Line')
plt.xlabel('Distributions')
plt.ylabel('ms')
plt.xticks(ind+0.15, ('50/50', '60/40', '70/30', '80/20', '90/10'))
plt.legend()
plt.show()
我是一名优秀的程序员,十分优秀!