如何基于嵌套列表绘制Matplotlib并列对比柱状图?
解决Matplotlib并列柱状图重叠问题的方案
嘿,我懂你的困扰——直接连续调用两次plt.bar()确实会让两组柱子完全重叠,因为它们使用了一模一样的X轴坐标。要实现并列展示的效果,我们只需要给其中一组柱子的X坐标手动偏移一个固定宽度,让两组柱子错开就行!
完整代码示例
import matplotlib.pyplot as plt import numpy as np # 你的原始数据 list1 = [[0,1],[1,2.5],[2,3],[3,5.6]] list2 = [[0,2],[2,5],[3,7]] # 提取list1的X轴刻度和对应Y值 x_labels, y_list1 = zip(*list1) # 为list2生成与list1 X轴一一对应的Y值,缺失的位置补0 y_list2 = [] for x in x_labels: # 查找list2中匹配的X值,找不到则返回0 matched_y = next((item[1] for item in list2 if item[0] == x), 0) y_list2.append(matched_y) # 设置柱子的宽度 bar_width = 0.35 # 将X轴标签转换为numpy数组,方便偏移计算 x = np.array(x_labels) # 绘制两组并列的柱状图:一组左移宽度的一半,一组右移宽度的一半 plt.bar(x - bar_width/2, y_list1, bar_width, label='List1数据') plt.bar(x + bar_width/2, y_list2, bar_width, label='List2数据') # 添加图表元素 plt.xlabel('X轴数值') plt.ylabel('Y轴数值') plt.title('两组数据的并列对比柱状图') plt.xticks(x) # 保持X轴刻度为原始的0、1、2、3 plt.legend() plt.show()
关键细节解释
X坐标偏移:
默认情况下,plt.bar()的柱子是居中对齐在给定的X坐标上的。我们把第一组柱子的X坐标左移bar_width/2,第二组右移bar_width/2,这样两组柱子就会刚好并排,不会重叠,总占用宽度为bar_width * 2。处理缺失数据:
你的list2中缺少X=1的对应数据,所以我们通过遍历list1的X刻度,为list2补充缺失位置的Y值(这里设为0),保证两组数据的长度一致,才能对应到相同的X轴位置。无需numpy的替代方案:
如果不想引入numpy,也可以用列表推导式手动生成偏移后的X坐标:x_left = [i - bar_width/2 for i in x_labels] x_right = [i + bar_width/2 for i in x_labels] plt.bar(x_left, y_list1, bar_width, label='List1数据') plt.bar(x_right, y_list2, bar_width, label='List2数据') plt.xticks(x_labels)
这样就能得到你想要的并列柱状图效果啦!
内容的提问来源于stack exchange,提问作者Bibek Mishra
相关产品推荐
相关产品推荐

