Matplotlib变量误绘至同一子图:如何分离子图绘制带误差棒变量
解决Matplotlib子图中误差棒绘制到同一子图的问题
嗨,这个问题我之前也碰到过!核心原因就是你没有明确指定每个绘图操作对应的子图坐标轴,Matplotlib默认会把所有绘图内容都放到最后激活的子图(也就是你的代码里的ax2)中。
下面是修改后的完整代码,能实现两个变量分别在独立子图中绘制带误差棒的图形:
from pandas import DataFrame, date_range, Timedelta import numpy as np from matplotlib import pyplot as plt # 生成测试数据 rng = date_range(start='2015-01-01', periods=5, freq='24H') df = DataFrame({'y':np.random.normal(size=len(rng))}, index=rng) y1 = df['y'] y2 = (y1*3) sd1 = (y1*2) sd2 = (y1*2) # 创建2行1列的子图,共享x轴让图形更协调 fig,(ax1,ax2) = plt.subplots(2,1,sharex=True, figsize=(8,6)) # 把y1的误差棒绘制到第一个子图ax1 ax1.errorbar(x=y1.index, y=y1.values, yerr=sd1.values, fmt='-o', capsize=5) ax1.set_title('变量y1的带误差棒图形') ax1.set_ylabel('y1数值') # 把y2的误差棒绘制到第二个子图ax2 ax2.errorbar(x=y2.index, y=y2.values, yerr=sd2.values, fmt='-s', capsize=5, color='orange') ax2.set_title('变量y2的带误差棒图形') ax2.set_ylabel('y2数值') ax2.set_xlabel('日期') # 自动调整子图间距,避免标题、标签重叠 plt.tight_layout() plt.show()
关键的几个注意点:
- 调用
errorbar时,通过指定ax1/ax2明确绑定对应的子图,这是解决问题的核心 fmt参数可以自定义线条和标记的样式,capsize用来设置误差棒两端的小帽子长度,提升可读性- 如果习惯用Pandas的
plot方法,也可以写成y1.plot(ax=ax1, yerr=sd1, kind='errorbar', capsize=5),效果完全一致 sharex=True让两个子图共享x轴,不仅节省空间,也让数据对比更直观tight_layout()会自动调整子图之间的间距,避免标题和标签互相遮挡
内容的提问来源于stack exchange,提问作者edson1991
相关产品推荐
相关产品推荐

