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

Python中基于字典绘制密度年月变化趋势图的问题

问题分析与代码修正

原代码存在几个关键问题:

  • 维度不匹配:循环每个月份时,用所有月份的列表x匹配当前月份的密度值,导致x轴与y轴长度不一致,无法正确绘图。
  • 时间顺序混乱:直接用月份数字作为x轴,会出现23年3月(3)排在21年5月(5)前面的情况,不符合时间逻辑。
  • 图例重复:每个月份循环都添加一次年份标签,导致图例中同一年份多次出现。
  • 同一月份多值展示错误:未针对同一月份的多个密度值做单独处理,无法在同一时间点展示所有数据。

修正后的代码

import matplotlib.pyplot as plt

# 你的原始字典数据
dateDensity = {
    21: {'05': {'210527_NS5001_01_AHT': 244.64}},
    22: {'11': {'221101_NS5002_02_AHV': 173.79, '221104_NS5002_03_AHC': 192.17}},
    23: {'03': {'230331_NS5002_04_AH3': 222.73}, '04': {'230405_NS5002_05_AHG': 223.97}}
}

plt.figure(figsize=(12,6))

# 给不同年份分配专属标记和颜色,便于区分
year_styles = {21: ('o', 'blue'), 22: ('s', 'orange'), 23: ('^', 'green')}

for year, months in dateDensity.items():
    marker, color = year_styles.get(year, ('o', 'gray'))
    # 收集当前年份的所有数据点:(时间标识, 密度)
    points = []
    for month, runids in months.items():
        # 用「年份+月份」组成整数时间标识(如2105代表21年5月),保证时间顺序正确
        time_id = int(f"{year}{month}")
        # 遍历每个运行ID的密度值,单独作为一个数据点
        for density in runids.values():
            points.append((time_id, density))
    # 拆分x轴和y轴数据
    x_vals = [p[0] for p in points]
    y_vals = [p[1] for p in points]
    # 绘制带标记的折线+散点,兼顾趋势和单个数据点的展示
    plt.plot(x_vals, y_vals, marker=marker, color=color, label=f'Year {year}', linestyle='--', linewidth=1)
    plt.scatter(x_vals, y_vals, color=color)

# 自定义x轴刻度标签,提升可读性
plt.xticks(
    [2105, 2211, 2303, 2304],
    ['21-05', '22-11', '23-03', '23-04']
)

plt.title('密度随时间变化趋势图')
plt.xlabel('时间(年-月)')
plt.ylabel('密度')
plt.legend()

plt.savefig('density_plot.pdf')
plt.show()

关键修正点说明

  1. 时间标识标准化:用年份+月份的整数作为x轴值,避免单纯用月份数字导致的时间顺序混乱。
  2. 数据点拆分:遍历每个运行ID,将单个密度值提取为独立数据点,确保同一月份的多个值都能完整展示。
  3. 图例优化:每个年份仅添加一次图例标签,避免重复显示。
  4. 样式区分:给不同年份分配不同标记和颜色,直观区分数据归属。
  5. x轴刻度优化:将整数时间标识替换为年-月格式的标签,提升图表可读性。

内容的提问来源于stack exchange,提问作者Callie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 03:11:09