如何按指定行列布局展示气象数据集各列分布?
解决方案
问题根源
你的代码存在三个核心问题:
- 每次循环创建包含12行(所有变量总数)的子图网格,完全不符合"每行对应一个变量"的需求,导致大量空图。
- 使用
axes[i]仅对单个子图赋值,无法将多个度量的直方图分配到对应的列。 - 排序逻辑
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
相关产品推荐
相关产品推荐

