You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 21:15:34