如何提前创建画布并在循环中为多站点同日期气象数据绘图?
动态创建画布绘制多站点同日期气象数据
你的核心问题是手动创建画布无法适配未知的日期数量,且原代码循环逻辑易导致绘图混乱。下面是直接可用的优化方案:
优化思路
- 提取所有站点涉及的日期,自动适配任意数量的日期
- 为每个日期单独创建画布和绘图轴,用字典映射日期与轴对象,方便后续调用
- 逐个遍历站点,将每个站点的每日数据对应画到匹配日期的画布上
完整代码
import pandas as pd import numpy as np from matplotlib import pyplot as plt # 示例气象数据(包含3个站点,其中Site_3多了一个01-04日期) weather_data = {'Site_1': {'Avg': {'01-01': pd.DataFrame(np.random.rand(5,2)), '01-02':pd.DataFrame(np.random.rand(5,2)), '01-03':pd.DataFrame(np.random.rand(5,2))}, 'Other': {'01-01': 'dummy_data', '01-02': 'dummy_data'}}, 'Site_2': {'Avg': {'01-01': pd.DataFrame(np.random.rand(5,2)), '01-02':pd.DataFrame(np.random.rand(5,2)), '01-03':pd.DataFrame(np.random.rand(5,2))}, 'Other': {'01-01': 'dummy_data', '01-02': 'dummy_data'}}, 'Site_3': {'Avg': {'01-01': pd.DataFrame(np.random.rand(5,2)), '01-02':pd.DataFrame(np.random.rand(5,2)), '01-03':pd.DataFrame(np.random.rand(5,2)), '01-04':pd.DataFrame(np.random.rand(5,2))}, 'Other': {'01-01': 'dummy_data', '01-02': 'dummy_data'}}} # 提取所有日期(去重并排序) all_days = set() for site_info in weather_data.values(): all_days.update(site_info['Avg'].keys()) all_days = sorted(all_days) # 为每个日期创建画布和绘图轴,用字典映射日期和轴对象 day_plot_axes = {} for day in all_days: fig, ax = plt.subplots(figsize=(8, 5)) ax.set_title(f"{day} 各站点气象数据") ax.set_xlabel("数值1") ax.set_ylabel("数值2") day_plot_axes[day] = ax # 遍历每个站点,把数据画到对应日期的画布上 for site_name, site_data in weather_data.items(): daily_avg = site_data['Avg'] for day, df in daily_avg.items(): # 获取当前日期对应的绘图轴 ax = day_plot_axes[day] # 绘制DataFrame的两列数据 ax.plot(df.iloc[:, 0], df.iloc[:, 1], label=site_name) # 添加图例 ax.legend() # 显示所有画布 plt.show()
代码优势
- 自动适配任意日期数量,无需手动指定画布个数
- 通过日期字典精准匹配画布,避免数据画错位置
- 新增站点或日期时无需修改核心逻辑,直接兼容
- 统一设置标题、坐标轴标签,绘图更规范
内容的提问来源于stack exchange,提问作者Regina Phalange
相关产品推荐
相关产品推荐

