如何在Pandas中绘制X轴为数值数轴而非分类的堆叠条形图
解决方案
问题原因
pandas内置的plot.bar方法默认会将x轴输入转换为离散分类变量,因此所有条形的间距是统一的,不会按照x的实际数值比例展示。
实现代码
直接使用matplotlib原生的bar方法手动堆叠绘制,即可保留x轴的数值比例特性:
import pandas as pd import matplotlib.pyplot as plt # 原有数据集 fid = ["name", "name", "name", "name", "name"] x = [1.02, 1.3, 2, 5, 10.6] y1 = [0, 1, 0.2, 0.6, 0.1] y2 = [0.3, 0, 0.1, 0.1, 0.4] y3 = [0.7, 0, 0.7, 0.3, 0.5] df = pd.DataFrame(data=zip(fid, x, y1, y2, y3), columns=["fid", "x", "y1", "y2", "y3"]) fig, ax = plt.subplots() # 可根据x轴数值分布调整条形宽度,避免重叠 bar_width = 0.2 # 逐层绘制堆叠条形 ax.bar(df['x'], df['y1'], width=bar_width, label='y1') ax.bar(df['x'], df['y2'], bottom=df['y1'], width=bar_width, label='y2') ax.bar(df['x'], df['y3'], bottom=df['y1'] + df['y2'], width=bar_width, label='y3') # 设置x轴固定刻度间隔,按需调整范围和步长即可 ax.set_xticks(range(0, 12, 2)) # 可选添加y轴网格提升可读性 ax.grid(axis='y', alpha=0.3) plt.legend(bbox_to_anchor=(1.05, 1), loc=2) plt.show()
可选优化
如果你的实际数据集x轴密度较高,更推荐使用堆叠面积图实现,展示效果更顺滑:
只需要将堆叠条形的绘制代码替换为:
ax.stackplot(df['x'], df['y1'], df['y2'], df['y3'], labels=['y1','y2','y3'])
内容的提问来源于stack exchange,提问作者a11
相关产品推荐
相关产品推荐

