如何用Pandas和Matplotlib读取Excel绘制同图双区域年度折线图
问题原因
代码报错、无法输出预期结果是三个核心问题导致的:
- 未定义
df_region变量:读取Excel得到的原始df是包含所有地点、所有区域的全量数据,你没有先做分组聚合计算各区域年度总和,直接引用不存在的DataFrame取值,拿到的数据维度完全不符合绘图要求。 - 绘图数据逻辑错误:x轴是3个年度的刻度,你却把单年份的整列数据作为y值传入,自然会出现x、y长度不匹配的报错。你需要的是每条折线对应一个区域,折线上的三个点分别对应该区域2019、2020、2021三年的汇总值,不是把三个年份拆成三个独立y变量。
- 年份顺序颠倒:你写的x轴顺序是
["2021", "2020", "2019"],画出来的时间趋势是倒序的,不符合常规展示逻辑。
修改方案
- 先用pandas的
groupby按区域分组,对三个年份的数值列求和,得到每个区域各年度的总数值 - 把x轴调整为时间正序的年份列表,分别提取A、B两个区域对应的三年汇总值作为两条折线的y轴数据,保证x和每个y序列长度一致
- 绘图时分别传入两个区域的数值序列,对应好图例标签
修改后可运行代码
import matplotlib.pyplot as plt import pandas as pd excel_file_path = "Testfile.xlsx" df = pd.read_excel(excel_file_path) # 按区域分组,计算各区域三个年份的数值总和 df_region_sum = df.groupby("区域列名")[["Values2019", "Values2020", "Values2021"]].sum().reset_index() # x轴按时间从早到晚排序 x = ["2019", "2020", "2021"] # 提取A区域三年的汇总值 y_a = df_region_sum[df_region_sum["区域列名"] == "A"][["Values2019", "Values2020", "Values2021"]].values.flatten() # 提取B区域三年的汇总值 y_b = df_region_sum[df_region_sum["区域列名"] == "B"][["Values2019", "Values2020", "Values2021"]].values.flatten() fig = plt.figure(figsize=(20,5)) # 分别绘制两个区域的折线 plt.plot(x, y_a, color = 'red', label = "A区域") plt.plot(x, y_b, color = 'blue', label = "B区域") plt.xlabel("年份") plt.ylabel("数值总和") plt.legend(loc='best') plt.show()
注意:代码里的
"区域列名"要替换成你自己Excel里存储A/B区域标识的实际列名。
内容的提问来源于stack exchange,提问作者Vavo202
相关产品推荐
相关产品推荐

