如何在matplotlib中将DataFrame列名作为x轴值绘制多城市时序数据
错误原因
你遇到的KeyError是因为loc是基于行索引标签取值,而非行的物理位置。如果你之前对DataFrame做过过滤、删除、排序等操作,行索引就不会是连续的0-8,自然在取loc[2]的时候找不到对应标签的行。
解法1:Pandas原生绘图(推荐,无需手动写循环)
你不需要自己遍历行列,只需要把数据结构调整为matplotlib适配的格式即可:先将City列设为行索引,再转置DataFrame,转置后行就是年份,每列对应一个城市的数值,直接调用plot方法就能自动生成每条城市的折线,还自带图例。
代码示例:
import matplotlib.pyplot as plt # 调整数据结构:设置City为索引后转置 processed_df = toPlot.set_index('City').T # 直接绘图 processed_df.plot(kind='line', figsize=(12, 6)) # 按需配置坐标轴和图例 plt.xlabel('年份') plt.ylabel('数值') plt.legend(title='城市') plt.show()
解法2:修改你原有的循环逻辑
如果你要沿用自己的思路,只需要把按标签取数的loc改成按行位置取数的iloc,同时提取城市名作为折线的label即可:
import matplotlib.pyplot as plt years = range(1990, 2021) # 遍历所有行 for row_idx in range(len(toPlot)): # 提取当前行的城市名 city_name = toPlot.iloc[row_idx, 0] # 提取当前行所有年份的数值(第1列到最后一列都是年份数据) datapoints = toPlot.iloc[row_idx, 1:].values # 绘图时指定label用于图例显示 plt.plot(years, datapoints, label=city_name) plt.xlabel('年份') plt.ylabel('数值') plt.legend(title='城市') plt.show()
内容的提问来源于stack exchange,提问作者tnorr
相关产品推荐
相关产品推荐

