如何让Matplotlib多个子图的X轴刻度垂直对齐?
问题描述
从DataFrame的特定行绘制3个子图时出现异常:第三个子图的X轴刻度间距与前两个不同,尽管绘图起始位置看似正确。推测原因是FE 57和FE 59的索引接近0,而FE 66的索引从3600开始。需要让所有子图从0开始保留空白,使X轴刻度垂直对齐。
现有代码
fig, axs = plt.subplots(3, 1) ser = plotdf[(plotdf['CAN_address'] == 'FE 57') & (plotdf['CAN_cmd'] == 62)]['CAN_value_translated'] axs[0].plot(ser.index, ser.values) axs[0].set_title('FE 57') ser = plotdf[(plotdf['CAN_address'] == 'FE 59') & (plotdf['CAN_cmd'] == 62)]['CAN_value_translated'] axs[1].plot(ser.index, ser.values) axs[1].set_title('FE 59') ser = plotdf[(plotdf['CAN_address'] == 'FE 66') & (plotdf['CAN_cmd'] == 62)]['CAN_value_translated'] axs[2].plot(ser.index, ser.values) axs[2].set_title('FE 66') plt.show()
异常效果

解决方案
方法一:手动统一X轴范围
先提取所有目标数据的最大索引值,再给每个子图设置相同的X轴范围(从0到该最大值):
# 获取三类数据的最大索引 max_index = max( plotdf[(plotdf['CAN_address'] == 'FE 57') & (plotdf['CAN_cmd'] == 62)].index.max(), plotdf[(plotdf['CAN_address'] == 'FE 59') & (plotdf['CAN_cmd'] == 62)].index.max(), plotdf[(plotdf['CAN_address'] == 'FE 66') & (plotdf['CAN_cmd'] == 62)].index.max() ) fig, axs = plt.subplots(3, 1) # 绘制FE 57 ser = plotdf[(plotdf['CAN_address'] == 'FE 57') & (plotdf['CAN_cmd'] == 62)]['CAN_value_translated'] axs[0].plot(ser.index, ser.values) axs[0].set_title('FE 57') axs[0].set_xlim(0, max_index) # 绘制FE 59 ser = plotdf[(plotdf['CAN_address'] == 'FE 59') & (plotdf['CAN_cmd'] == 62)]['CAN_value_translated'] axs[1].plot(ser.index, ser.values) axs[1].set_title('FE 59') axs[1].set_xlim(0, max_index) # 绘制FE 66 ser = plotdf[(plotdf['CAN_address'] == 'FE 66') & (plotdf['CAN_cmd'] == 62)]['CAN_value_translated'] axs[2].plot(ser.index, ser.values) axs[2].set_title('FE 66') axs[2].set_xlim(0, max_index) plt.tight_layout() plt.show()
方法二:共享X轴自动对齐
创建子图时设置sharex=True,让所有子图共用同一X轴,再强制X轴从0开始:
fig, axs = plt.subplots(3, 1, sharex=True) # 绘制FE 57 ser = plotdf[(plotdf['CAN_address'] == 'FE 57') & (plotdf['CAN_cmd'] == 62)]['CAN_value_translated'] axs[0].plot(ser.index, ser.values) axs[0].set_title('FE 57') # 绘制FE 59 ser = plotdf[(plotdf['CAN_address'] == 'FE 59') & (plotdf['CAN_cmd'] == 62)]['CAN_value_translated'] axs[1].plot(ser.index, ser.values) axs[1].set_title('FE 59') # 绘制FE 66 ser = plotdf[(plotdf['CAN_address'] == 'FE 66') & (plotdf['CAN_cmd'] == 62)]['CAN_value_translated'] axs[2].plot(ser.index, ser.values) axs[2].set_title('FE 66') # 强制X轴起始为0 plt.xlim(left=0) plt.tight_layout() plt.show()
说明:
sharex=True会自动同步所有子图的X轴刻度和范围,配合plt.xlim(left=0)能让第三个子图在0到3600区间显示空白,实现三个子图X轴刻度完全垂直对齐。
内容的提问来源于stack exchange,提问作者Anjo
相关产品推荐
相关产品推荐

