子图X轴标签旋转问题:设置双图旋转70度未全部生效
解决Matplotlib/Seaborn子图X轴标签仅部分旋转的问题
问题出在你使用了全局的plt.xticks()方法——它只会对当前活跃的坐标轴生效,而当你切换子图绘制时,当前活跃轴会跟着变化,导致只有最后一个子图的刻度被正确旋转。
正确的解决方案有两种:
1. 直接操作每个子图的轴对象
对每个ax元素单独设置刻度旋转,这种方式最直观,也不会受当前轴切换的影响:
fig, ax = plt.subplots(1,2, figsize = (30, 8)) # 绘制第一个子图并设置X轴刻度旋转 g1 = sns.lineplot(data = plsWeekly , x = 'Date', y = 'Close', ax=ax[0]) ax[0].tick_params(axis='x', rotation=70) # 绘制第二个子图并设置X轴刻度旋转 g2 = sns.lineplot(data = asxWeekly , x = 'Date', y = 'Close', ax=ax[1]) ax[1].tick_params(axis='x', rotation=70)
2. 批量设置所有子图的刻度
如果子图数量较多,可以用plt.setp()批量处理,避免重复代码:
fig, ax = plt.subplots(1,2, figsize = (30, 8)) sns.lineplot(data = plsWeekly , x = 'Date', y = 'Close', ax=ax[0]) sns.lineplot(data = asxWeekly , x = 'Date', y = 'Close', ax=ax[1]) # 批量旋转所有子图的X轴标签 plt.setp([a.get_xticklabels() for a in ax], rotation=70)
为什么原代码失效?
plt.xticks(rotation=70)本质是修改当前活跃轴的刻度。在你调用sns.lineplot(ax=ax[1])后,Matplotlib会把ax[1]设为当前活跃轴,因此最后一次plt.xticks()只会作用于它,而第一个子图的刻度设置可能被Seaborn的绘图过程覆盖,或者根本没生效。
内容的提问来源于stack exchange,提问作者Aris dela Cruz
相关产品推荐
相关产品推荐

