Matplotlib 3×9子图样式仅生效于最后一幅及布局重叠问题求助
解决Matplotlib 3×9子图样式不全局生效与子图重叠问题
一、样式仅最后一个子图生效的解决办法
你用plt.xticks()、plt.ylim()这类全局函数时,它们只会对当前处于活跃状态的子图(也就是循环最后绘制的那个)生效。要让所有子图都应用这些样式,必须遍历每一个子图轴,逐个设置:
可以用axes.flat把二维的axes数组扁平化,遍历起来更方便:
# 遍历所有子图轴,统一设置样式 for ax in axes.flat: ax.set_xticks([]) # 隐藏x刻度 ax.set_yticks([]) # 隐藏y刻度 ax.axis('scaled') # 等比例缩放轴 ax.set_ylim([15, 90]) # 设置y轴范围
二、解决子图重叠问题
有两种简单的方式调整间距:
- 方式1:创建子图时直接开启自动布局
在plt.subplots()里加入tight_layout=True参数,Matplotlib会自动计算合理的子图间距:fig, axes = plt.subplots(3, 9, tight_layout=True) - 方式2:手动精细调整间距
如果自动布局效果不够理想,用plt.subplots_adjust()自定义行/列间距:plt.subplots_adjust(left=0.05, right=0.95, bottom=0.05, top=0.95, hspace=0.2, wspace=0.1) # hspace是行之间的间距,wspace是列之间的间距,数值可根据需求调整
修改后的完整代码
import matplotlib.pyplot as plt import numpy as np # 假设你已定义v_min, v_max, v_min_d_avg, v_max_d_avg, V_avg, V_avg_dud, rgb_V, rgb_D_V等变量 # 开启自动布局解决子图重叠 fig, axes = plt.subplots(3, 9, tight_layout=True) for j in range(len(axes[0])): levels = np.linspace(v_min, v_max, 21) for i in range(1, 19, 2): axes[0][j].contourf(V_avg[i], levels=levels, cmap=rgb_V) for i in range(2, 20, 2): axes[1][j].contourf(V_avg[i], levels=levels, cmap=rgb_V) levels = np.linspace(v_min_d_avg, v_max_d_avg, 21) for i in range(0, 9): axes[2][j].contourf(V_avg_dud[i], levels=levels, cmap=rgb_D_V) # 遍历所有子图统一设置样式 for ax in axes.flat: ax.set_xticks([]) ax.set_yticks([]) ax.axis('scaled') ax.set_ylim([15, 90]) plt.savefig("aaa", dpi=300, bbox_inches='tight') plt.show()
注:原代码里有几行未赋值的np.linspace(...)属于无效代码,已删除。
内容的提问来源于stack exchange,提问作者TFAE
相关产品推荐
相关产品推荐

