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()
关键修正点说明
- 时间标识标准化:用
年份+月份的整数作为x轴值,避免单纯用月份数字导致的时间顺序混乱。 - 数据点拆分:遍历每个运行ID,将单个密度值提取为独立数据点,确保同一月份的多个值都能完整展示。
- 图例优化:每个年份仅添加一次图例标签,避免重复显示。
- 样式区分:给不同年份分配不同标记和颜色,直观区分数据归属。
- x轴刻度优化:将整数时间标识替换为
年-月格式的标签,提升图表可读性。
内容的提问来源于stack exchange,提问作者Callie
相关产品推荐
相关产品推荐

