使用Matplotlib绘制多DataFrame条形图并排时重叠问题求解
如何用Matplotlib实现多个数据框的条形图并排展示?
我完全懂你的挫败感!之前我也查了一堆StackOverflow帖子,调align='edge'/align='center'参数、改宽度,结果条形图还是叠在一起,后来试了几种方法,发现Y.Luo分享的Pandas原生方法是最省心好用的,给你详细说下:
问题根源
你之前只调整样式参数,没解决核心问题:每个数据框的条形需要在x轴上占据不同的位置区间,只调align和宽度没法让它们错开。
最优解决方案(Pandas方法)
把三个数据框按行索引对齐合并,直接用Pandas的plot.bar(),它会自动帮你处理并排逻辑,不需要手动计算位置:
import pandas as pd import matplotlib.pyplot as plt # 确保df1、df2、df3有相同的行索引(比如都是分类标签) combined_df = pd.concat([df1, df2, df3], axis=1) # 绘制并排条形图 ax = combined_df.plot(kind='bar', figsize=(12, 7), width=0.8) ax.set_title('三个数据框的并排条形图', fontsize=14) ax.set_xlabel('分类标签', fontsize=12) ax.set_ylabel('数值', fontsize=12) ax.legend(['df1数据', 'df2数据', 'df3数据'], fontsize=10) plt.xticks(rotation=45) # 如果标签太长可以旋转 plt.tight_layout() plt.show()
这种方法的好处是:Pandas会自动给每列分配对应的条形位置,完美避免重叠,代码也最简洁。
备选方案(手动用Matplotlib控制)
如果需要更定制化的样式,可以手动计算每个条形的x轴偏移量:
import matplotlib.pyplot as plt import numpy as np # 定义条形宽度 bar_width = 0.25 # 获取x轴基准位置(假设三个数据框的x标签一致) x = np.arange(len(df1.index)) # 分别绘制三个数据框的条形,每个偏移一个宽度 plt.bar(x - bar_width, df1.iloc[:, 0], width=bar_width, label='df1') plt.bar(x, df2.iloc[:, 0], width=bar_width, label='df2') plt.bar(x + bar_width, df3.iloc[:, 0], width=bar_width, label='df3') # 设置x轴标签和其他样式 plt.xticks(x, df1.index, rotation=45) plt.title('手动调整的并排条形图') plt.xlabel('分类标签') plt.ylabel('数值') plt.legend() plt.tight_layout() plt.show()
这里通过x - bar_width、x、x + bar_width让三个数据框的条形在x轴上错开,再配合一致的宽度,就不会重叠了。
你之前的尝试没成功,就是因为没给每个数据框的条形设置不同的x位置,只调align和宽度是不够的哦~
内容的提问来源于stack exchange,提问作者chowpay
相关产品推荐
相关产品推荐

