Matplotlib堆叠子图如何设置x轴刻度从原点184.0开始显示
解决方法
你可以通过两种方式实现x轴从坐标原点直接显示最小值184.0:
方案1:单独设置每个子图的x轴左边界
你之前调用plt.margins(x=0)没有生效的原因是该方法是全局参数设置,不会作用于已经创建完成的子图对象。你可以为每个子图单独设置x轴左边界,修改逻辑如下:
# 以第一个子图为例,其余5个子图同理添加set_xlim代码即可 plt1.plot("DOY", "By", data=df,color='black') plt1.set_xlim(left=df["DOY"].min()) # 新增行,动态取x轴最小值作为左边界,也可直接写死为184 plt1.set_ylabel("By",size=16) # 其余子图依次添加 pltX.set_xlim(left=df["DOY"].min()) 即可
方案2:创建子图时开启x轴共享(更推荐)
堆叠排布的子图可以直接共享x轴,仅需设置一次就能同步所有子图的x轴范围,还能避免重复显示x轴刻度,代码更简洁,完整修改示例如下:
import matplotlib.pyplot as plt # 创建6行1列的子图,开启x轴共享 fig, axs = plt.subplots(nrows=6, ncols=1, figsize=(20,17), sharex=True) # 统一设置所有子图x轴范围和边距 axs[0].set_xlim(left=df["DOY"].min(), right=df["DOY"].max()) axs[0].margins(x=0) # 逐个绘制子图,axs[0]对应最上方子图,axs[5]对应最下方子图 axs[0].plot("DOY", "By", data=df, color='black') axs[0].set_ylabel("By", size=16) axs[0].set_title("3-6 July 2003", size=20) axs[0].get_yaxis().set_label_coords(-0.05, 0.5) axs[1].plot("DOY", "Bz", data=df, color='black') axs[1].set_ylabel("Bz", size=16) axs[1].get_yaxis().set_label_coords(-0.05, 0.5) axs[2].plot("DOY", "Vsw", data=df, color='black') axs[2].set_ylabel("Vsw", size=16) axs[2].get_yaxis().set_label_coords(-0.05, 0.5) axs[3].plot("DOY", "Nsw", data=df, color='black') axs[3].set_ylabel("Nsw", size=16) axs[3].get_yaxis().set_label_coords(-0.05, 0.5) axs[4].plot("DOY", "reconnection_rate", data=df, color='black') axs[4].set_ylabel("MRR", size=16) axs[4].get_yaxis().set_label_coords(-0.05, 0.5) axs[5].plot("DOY", "magnetopause_distance", data=df, color='black') axs[5].set_ylabel("MD", size=16) axs[5].set_xlabel("Day of Year", size=16) axs[5].get_yaxis().set_label_coords(-0.05, 0.5) plt.savefig('3 to 6 July 2003 plot.jpg', format='jpeg',dpi=None, edgecolor='black', transparent=True, bbox_inches='tight')
如果需要固定x轴左边界为184,直接把上述代码中的df["DOY"].min()替换为184即可。
内容的提问来源于stack exchange,提问作者Prater
相关产品推荐
相关产品推荐

