matplotlib如何通过迭代方法绘制折线图并分配正确标签
实现方法
你现有代码的核心问题是循环内label参数硬编码为固定值sales,导致所有折线图例名称一致,另外全局绘图配置需要放在绘图语句前才能生效,日期列建议先转为标准datetime格式避免x轴排序错乱。
下面分别给出两种场景的可运行实现:
场景1:单图展示所有品类折线
直接将循环遍历到的列名作为label参数传入即可自动匹配对应燃油品类:
import pandas as pd import matplotlib.pyplot as plt # 全局绘图参数必须放在绘图逻辑前生效 plt.rcParams["figure.figsize"] = (10, 6) # 转换日期格式,避免x轴刻度乱序、重叠 df["Update"] = pd.to_datetime(df["Update"]) # 遍历所有燃油品类列(跳过第一列日期字段) for fuel_type in df.columns[1:]: # label直接传入当前遍历到的品类名 plt.plot(df["Update"], df[fuel_type], label=fuel_type, linewidth=3) plt.title("Fuels price by Date") plt.xlabel("Date") plt.ylabel("Price (PLN)") plt.legend() plt.xticks(rotation=45) # 日期标签倾斜45度避免重叠 plt.tight_layout() # 自动调整布局防止边缘标签被截断 plt.show()
运行后图例将自动显示Pb95/Pb98/diesel/heating oil四个品类名,和折线一一对应。
场景2:分品类绘制独立子图
提前创建子图网格,通过zip将子图对象和品类列绑定后循环绘图即可:
import pandas as pd import matplotlib.pyplot as plt import numpy as np plt.rcParams["figure.figsize"] = (12, 10) df["Update"] = pd.to_datetime(df["Update"]) fuel_cols = df.columns[1:] # 创建2行2列的子图网格,展平为一维数组方便遍历 fig, axes = plt.subplots(nrows=2, ncols=2) axes = axes.flatten() for ax, fuel_type in zip(axes, fuel_cols): # 随机生成折线颜色做区分,也可以自定义固定色值列表 ax.plot(df["Update"], df[fuel_type], linewidth=3, color=np.random.rand(3,)) ax.set_title(f"{fuel_type} Price Trend") ax.set_xlabel("Date") ax.set_ylabel("Price (PLN)") ax.tick_params(axis="x", rotation=45) # 设置总图标题 fig.suptitle("Fuels price by Date", y=1.02, fontsize=15) plt.tight_layout() plt.show()
如果需要垂直单列排布所有子图,只需将plt.subplots参数改为nrows=len(fuel_cols), ncols=1即可。
注意事项
迭代列时建议直接使用
df.columns[1:]获取列名遍历,比写死列索引范围df.iloc[:,1:6]兼容性更强,后续增删数据集列时不需要修改迭代逻辑。
内容的提问来源于stack exchange,提问作者12666727b9
相关产品推荐
相关产品推荐

