如何去除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
相关产品推荐
相关产品推荐

