如何让pandas条形图X轴表现与原生matplotlib的Axes.bar一致
问题根因
pandas 提供的plot.bar()快捷接口默认将索引作为离散分类值处理,会自动把每个索引项映射为从0开始的整数横坐标,不会保留原时间索引对应的 matplotlib 日期浮点值,导致和折线图的X轴坐标体系完全不匹配,因此出现折线消失、日期刻度调整失效的问题。
解决方法
方案1:开启时间轴兼容参数(最简单)
调用 pandas 绘图接口时添加x_compat=True参数,即可让条形图保留和原生 matplotlib 一致的时间轴坐标体系,后续的日期定位器也能正常生效:
# close100和volume100是具有相同日期索引的时间序列 fig, ax = plt.subplots(nrows=2, ncols=2, figsize=(12, 6)) close100.plot(ax=ax[0, 0]) ax[1, 0].bar(volume100.index, volume100.values) # 直接调用Axes.bar实现 close100.plot(ax=ax[1, 0]) # 调用Series.plot.bar时添加x_compat参数开启时间轴兼容 volume100.plot.bar(ax=ax[1, 1], x_compat=True) close100.plot(ax=ax[1, 1]) # 此时日期定位器可以正常工作 ax[1, 1].xaxis.set_major_locator(mdates.MonthLocator()) ax[1, 1].xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m'))
方案2:直接使用matplotlib原生bar接口(最稳妥)
你左侧子图的原生Axes.bar写法本身就不存在坐标兼容问题,不需要额外适配参数,绘制时间序列的组合图时更推荐这种实现。
方案3:手动对齐坐标(适合自定义刻度场景)
如果需要自定义分类刻度显示,可手动将折线图的横坐标对齐到条形图的整数坐标体系,再手动替换刻度标签:
volume100.plot.bar(ax=ax[1, 1]) # 折线图x轴用0到序列长度-1的整数,和条形图坐标对齐 ax[1,1].plot(range(len(close100)), close100.values, color='orange', label=close100.name) # 手动筛选月度刻度位置 month_ticks = [i for i, dt in enumerate(volume100.index) if i == 0 or dt.month != volume100.index[i-1].month] ax[1,1].set_xticks(month_ticks) ax[1,1].set_xticklabels([volume100.index[i].strftime('%Y-%m') for i in month_ticks], rotation=30) ax[1,1].legend()
内容的提问来源于stack exchange,提问作者user554319
相关产品推荐
相关产品推荐

