修改以下代码,虽然运行正常,但显示不正确,要求使两幅图的尺寸大致相等。import pandas as pd import numpy as np import matplotlib.pyplot as plt from matplotlib.colors import LogNorm, Normalize from matplotlib.gridspec import GridSpec import os import xarray as xr from scipy.stats import pearsonr from scipy.stats import spearmanr, kendalltau '''比较各个模型与标准模型(CSRM、GLDAS)的偏离程度,以标准线的形式给出''' def plot_model_comparisons(file_path: str, base_model: str = "CSRM", compare_models: list = ["RAPM", "TDAPM"],\ param_type: str = "trend", area_col: str = "area", save_path=r'D:\ill_pose\verify\outdata'): try: df = pd.read_excel(file_path) except FileNotFoundError: raise ValueError(f"文件不存在:{file_path}") # 验证参数有效性 valid_params = ["trend", "annual", 'semiannual'] if param_type not in valid_params: raise ValueError(f"参数类型必须为 {valid_params}") if param_type == 'trend': units = '(cm/yr)' else: units = '(cm)' # 自动生成列名模板 base_col = f"{param_type}-{base_model}" compare_cols = [f"{param_type}-{model}" for model in compare_models] # 检查列存在性 required_cols = [base_col, area_col] + compare_cols missing_cols = [col for col in required_cols if col not in df.columns] if missing_cols: raise KeyError(f"缺失必要列:{missing_cols}") # 创建子图布局 n_models = len(compare_models) ncols = min(3, n_models) # 每行最多3个子图 nrows = int(np.ceil(n_models / ncols)) fig = plt.figure(figsize=(12, 3 * nrows), dpi=500) gs = GridSpec(nrows, ncols, figure=fig) axes = [] # cmap = 'viridis' cmap = plt.get_cmap('RdYlBu_r') # 反转色带以符合常见地理可视化习惯 norm = Normalize(vmin=1e5, vmax=6e6) # norm = LogNorm(vmin=1e5, vmax=6e6) # 对数归一化 # 遍历每个对比模型 for i, model in enumerate(compare_models): # 创建子图 ax = fig.add_subplot(gs[i // ncols, i % ncols]) axes.append(ax) # 提取对比数据列 compare_col = f"{param_type}-{model}" df_plot = df[[base_col, compare_col, area_col]].copy()
时间: 2025-06-11 15:57:35 浏览: 10
<think>好的,用户的问题是关于在matplotlib中调整子图尺寸,确保所有子图大小一致。我需要结合之前学过的引用内容来解答这个问题。首先,用户提到他们已经有可以运行的代码,但需要调整figsize或其他参数来实现子图大小一致。根据引用[1],使用subplots函数时,可以通过gridspec_kw参数来指定子图的相对大小或比率。这可能是一个关键点。
然后,引用[4]中提到如何保证子图大小相同,用户可能需要设置gridspec_kw的width_ratios和height_ratios参数,或者使用constrained_layout参数。另外,引用[3]提到调整pad参数和figsize的高度,这可能对整体布局有帮助。还有引用[2]讨论了子图之间的间距调整,虽然用户主要关注大小一致,但间距也可能影响显示效果。
我需要分步骤解答:首先使用figsize统一画布尺寸,然后使用gridspec_kw调整子图比例,接着用constrained_layout自动调整间距,或者手动调整布局。可能需要举例子,比如创建2x2子图时设置gridspec_kw的width_ratios和height_ratios都为[1,1],确保每个子图等宽等高。另外,使用plt.subplots_adjust调整间距也可能有用。
用户可能需要具体的代码示例,所以应该给出示例代码,展示如何设置这些参数。同时,注意事项部分要提到subplot_kw可能影响坐标轴比例,需要保持一致。最后生成相关问题,比如如何调整间距、保持宽高比或处理不等高子图等。</think>在matplotlib中调整子图尺寸确保大小一致,可通过以下方法实现:
### 方法一:使用`figsize`和`gridspec_kw`参数
```python
import matplotlib.pyplot as plt
fig, axs = plt.subplots(2, 2,
figsize=(8, 6), # 统一画布尺寸
gridspec_kw={'width_ratios': [1, 1], # 宽度比例相同
'height_ratios': [1, 1]}) # 高度比例相同
plt.show()
```
此方法通过`width_ratios`和`height_ratios`强制所有子图保持相同比例[^1][^4]
### 方法二:启用`constrained_layout`自动调整
```python
fig, axs = plt.subplots(3, 1,
figsize=(6, 9),
constrained_layout=True) # 自动优化布局
plt.show()
```
`constrained_layout`会智能调整子图间距和尺寸[^3]
### 方法三:手动调整布局参数
```python
fig = plt.figure(figsize=(10, 5))
ax1 = fig.add_subplot(1, 2, 1)
ax2 = fig.add_subplot(1, 2, 2)
plt.subplots_adjust(wspace=0.3, # 水平间距
left=0.1, right=0.9, # 左右边距
bottom=0.15, top=0.85) # 上下边距
plt.show()
```
通过精确控制边距参数实现尺寸统一[^2]
### 注意事项:
1. 若需要完全相同的坐标轴比例,可添加:
```python
ax.set_aspect('equal') # 对所有坐标轴设置
```
2. 使用`subplot_kw`参数统一子图属性:
```python
plt.subplots(2, 2, subplot_kw={'projection': 'polar'})
```
阅读全文
相关推荐


















