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

如何去除Matplotlib子图绘制图像末尾的空白区域?

解决Matplotlib子图末尾空白区域的问题

要去除子图末尾的空白区域,你可以从移除多余空自图和优化布局参数两个方向入手,以下是具体修改方案:

方案1:移除多余空自图(推荐)

你当前创建了3行8列共24个子图,但仅需展示22个数据,剩余两个空自图即便设置axis("off")仍会占据布局空间。通过remove()方法彻底删除这些空自图,再调整布局即可消除空白:

修改后的完整代码:

import numpy as np 
import xarray as xr 
import geopandas as gpd 
import requests

import matplotlib.pyplot as plt 
# 转换字符串坐标为浮点数
def data_extract(link):
    text = requests.get(link).text.split(",")
    return np.array([float(i) for i in text if i])
# 获取经纬度数据
y = data_extract("https://raw.githubusercontent.com/tuyenhavan/test/main/latitude.txt")
x = data_extract("https://raw.githubusercontent.com/tuyenhavan/test/main/longtitude.txt")
# 生成模拟数据
random_data = np.random.randint(0, 3, (22, 937, 399))
# 包装为Xarray DataArray
data = xr.DataArray(random_data, dims=("band", "y", "x"), coords={
    "band": np.arange(len(random_data)),
    "y": y,
    "x": x
})
# 读取研究区域边界
aoi = gpd.read_file("https://raw.githubusercontent.com/tuyenhavan/test/main/area.geojson")
# 创建子图
fig, axes = plt.subplots(nrows=3, ncols=8, figsize=(12,16), sharex=True, sharey=True)

# 调整子图间距:减少行间距并消除列间距
fig.subplots_adjust(hspace=-0.55, wspace=0)

cmap="Spectral"
for i, ax in enumerate(axes.flatten()):
    if i < len(data):
        tem = data[i]
        tem=tem.rio.write_crs(aoi.crs)
        plot = tem.plot(ax=ax, cmap=cmap, add_colorbar=False, vmin=1, vmax=3)
        aoi.plot(ax=ax, color="None", edgecolor="black", linewidth=0.5)
        ax.set_title(f"{1+i}")
        ax.set_ylabel("")
        ax.set_xlabel("")
    else:
        # 彻底移除多余子图,而非仅隐藏轴
        ax.remove()

# 自动调整布局,消除整体边缘空白
fig.tight_layout()
plt.show()

方案2:动态计算子图行列(适配数据数量变化)

如果数据数量可能变动,可以动态计算所需的子图行列数,仅创建必要的子图,从根源避免空白:

import numpy as np 
import xarray as xr 
import geopandas as gpd 
import requests

import matplotlib.pyplot as plt 
def data_extract(link):
    text = requests.get(link).text.split(",")
    return np.array([float(i) for i in text if i])

y = data_extract("https://raw.githubusercontent.com/tuyenhavan/test/main/latitude.txt")
x = data_extract("https://raw.githubusercontent.com/tuyenhavan/test/main/longtitude.txt")
random_data = np.random.randint(0, 3, (22, 937, 399))
data = xr.DataArray(random_data, dims=("band", "y", "x"), coords={
    "band": np.arange(len(random_data)),
    "y": y,
    "x": x
})
aoi = gpd.read_file("https://raw.githubusercontent.com/tuyenhavan/test/main/area.geojson")

# 动态计算子图行列:每行8个,向上取整计算行数
n_cols = 8
n_rows = (len(data) + n_cols - 1) // n_cols  

fig, axes = plt.subplots(nrows=n_rows, ncols=n_cols, figsize=(12, 12), sharex=True, sharey=True)
fig.subplots_adjust(hspace=-0.55, wspace=0)

cmap="Spectral"
# 遍历子图,仅处理有效轴
for i, ax in enumerate(axes.flatten()):
    if i < len(data) and ax is not None:
        tem = data[i]
        tem=tem.rio.write_crs(aoi.crs)
        plot = tem.plot(ax=ax, cmap=cmap, add_colorbar=False, vmin=1, vmax=3)
        aoi.plot(ax=ax, color="None", edgecolor="black", linewidth=0.5)
        ax.set_title(f"{1+i}")
        ax.set_ylabel("")
        ax.set_xlabel("")
    elif ax is not None:
        ax.remove()

fig.tight_layout()
plt.show()

关键改动说明

  • ax.remove():彻底删除多余空自图,避免其占据布局空间;
  • wspace=0:消除子图列之间的空白,让布局更紧凑;
  • fig.tight_layout():自动调整子图位置,消除整体边缘的空白;
  • 动态计算行列数:适配数据数量变化,从根源减少无效子图。

内容的提问来源于stack exchange,提问作者Tuyen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 12:50:20