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

如何按指定行列布局展示气象数据集各列分布?

解决方案

问题根源

你的代码存在三个核心问题:

  1. 每次循环创建包含12行(所有变量总数)的子图网格,完全不符合"每行对应一个变量"的需求,导致大量空图。
  2. 使用axes[i]仅对单个子图赋值,无法将多个度量的直方图分配到对应的列。
  3. 排序逻辑x.split('_')[0]无效,因为你的列名是驼峰式(无下划线),需要按前缀(mean/min/max/mode)排序。

方案1:每行对应一个变量,每列对应一个度量

为每个变量生成独立的子图网格(1行,列数等于该变量的度量数量),确保每个度量对应单独的直方图:

import matplotlib.pyplot as plt

variable_columns = {
    'precip': ['meanPrecip', 'minPrecip', 'maxPrecip'],
    'pressureChange': ['meanPressurechange', 'minPressurechange', 'maxPressurechange'],
    'pressureMeanSeaLevel': ['meanPressuremeansealevel', 'minPressuremeansealevel', 'maxPressuremeansealevel'],
    'relativeHumidity': ['meanRelativehumidity', 'minRelativehumidity', 'maxRelativehumidity'],
    'snow': ['meanSnow', 'minSnow', 'maxSnow'],
    'temperature': ['meanTemperature', 'minTemperature', 'maxTemperature'],
    'temperatureDewPoint': ['meanTemperaturedewpoint', 'minTemperaturedewpoint', 'maxTemperaturedewpoint'],
    'temperatureFeelsLike': ['meanTemperaturefeelslike', 'minTemperaturefeelslike', 'maxTemperaturefeelslike'],
    'uvIndex': ['modeUvindex', 'maxUvindex', 'minUvindex'],
    'visibility': ['meanVisibility', 'minVisibility', 'maxVisibility'],
    'windDirection': ['meanWinddirection'],
    'windSpeed': ['meanWindspeed', 'minWindspeed', 'maxWindspeed']
}

# 按度量前缀排序的辅助函数
def sort_metric(col):
    if col.startswith('mean'):
        return 0
    elif col.startswith('min'):
        return 1
    elif col.startswith('max'):
        return 2
    elif col.startswith('mode'):
        return 3
    return 4

for var_type, columns in variable_columns.items():
    ordered_cols = sorted(columns, key=sort_metric)
    n_cols = len(ordered_cols)
    
    # 创建1行n_cols列的子图
    fig, axes = plt.subplots(nrows=1, ncols=n_cols, figsize=(5*n_cols, 4))
    axes = axes.flatten() if n_cols > 1 else [axes]
    
    data = METEO_COMPLETO[ordered_cols]
    
    # 为每个度量绘制单独的直方图
    for idx, col in enumerate(ordered_cols):
        data[col].hist(ax=axes[idx], bins=20, alpha=0.7, edgecolor='black', color='skyblue')
        axes[idx].set_title(col)
        axes[idx].set_xlabel('Valor')
        axes[idx].set_ylabel('Frecuencia')
    
    fig.suptitle(f'Distribución de {var_type}', y=1.02, fontsize=12)
    plt.tight_layout()
    plt.show()

方案2:同一变量的所有度量在同图对比

将同一变量的均值、最小值、最大值等分布绘制在同一张图中,用颜色区分,便于直观对比:

import matplotlib.pyplot as plt

variable_columns = {
    'precip': ['meanPrecip', 'minPrecip', 'maxPrecip'],
    'pressureChange': ['meanPressurechange', 'minPressurechange', 'maxPressurechange'],
    'pressureMeanSeaLevel': ['meanPressuremeansealevel', 'minPressuremeansealevel', 'maxPressuremeansealevel'],
    'relativeHumidity': ['meanRelativehumidity', 'minRelativehumidity', 'maxRelativehumidity'],
    'snow': ['meanSnow', 'minSnow', 'maxSnow'],
    'temperature': ['meanTemperature', 'minTemperature', 'maxTemperature'],
    'temperatureDewPoint': ['meanTemperaturedewpoint', 'minTemperaturedewpoint', 'maxTemperaturedewpoint'],
    'temperatureFeelsLike': ['meanTemperaturefeelslike', 'minTemperaturefeelslike', 'maxTemperaturefeelslike'],
    'uvIndex': ['modeUvindex', 'maxUvindex', 'minUvindex'],
    'visibility': ['meanVisibility', 'minVisibility', 'maxVisibility'],
    'windDirection': ['meanWinddirection'],
    'windSpeed': ['meanWindspeed', 'minWindspeed', 'maxWindspeed']
}

# 度量前缀与颜色映射
color_map = {
    'mean': '#1f77b4',
    'min': '#ff7f0e',
    'max': '#2ca02c',
    'mode': '#d62728'
}

# 复用之前定义的sort_metric函数
def sort_metric(col):
    if col.startswith('mean'):
        return 0
    elif col.startswith('min'):
        return 1
    elif col.startswith('max'):
        return 2
    elif col.startswith('mode'):
        return 3
    return 4

for var_type, columns in variable_columns.items():
    ordered_cols = sorted(columns, key=sort_metric)
    fig, ax = plt.subplots(figsize=(6, 4))
    
    for col in ordered_cols:
        # 获取当前列的度量前缀
        prefix = next(k for k in color_map if col.startswith(k))
        METEO_COMPLETO[col].hist(ax=ax, bins=20, alpha=0.6, edgecolor='black', 
                                 color=color_map[prefix], label=col)
    
    ax.set_title(f'Distribución de {var_type}')
    ax.set_xlabel('Valor')
    ax.set_ylabel('Frecuencia')
    ax.legend()
    plt.tight_layout()
    plt.show()

核心优化点

  • 直接遍历variable_columns字典,无需额外维护variable_types列表,代码更简洁。
  • 修正排序逻辑,适配驼峰式列名的前缀排序需求。
  • 为每个变量创建匹配其度量数量的子图,避免空图浪费空间。
  • 方案2通过颜色区分不同度量,强化同一变量下各统计值的分布对比。

内容的提问来源于stack exchange,提问作者Pablo Moreira Garcia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 18:54:54