Python根据Excel数据画趋势图:pandas读取matplotlib出图
用Python pandas读取Excel数据,matplotlib自动画折线趋势图,含缺失值处理、按日期排序、中文配置,代码完整可直接运行。
场景痛点
数据都存在Excel表里,每个月要从表里挑两列画趋势图,复制粘贴到报告里。表一换版本、列名改了,又得重新选数据。用pandas读Excel、matplotlib出图,脚本写一次,以后把Excel丢进文件夹跑一下就自动出图,不用手动操作。
用到的库
pip install matplotlib pandas openpyxl
完整代码
# 导入库
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import pandas as pd
import os
# 解决中文乱码
matplotlib.rcParams["font.sans-serif"] = ["SimHei", "Microsoft YaHei", "Arial Unicode MS"]
matplotlib.rcParams["axes.unicode_minus"] = False
def ensure_sample_excel(path):
"""如果Excel文件不存在,先生成一个示例文件方便测试"""
if os.path.exists(path):
return
df = pd.DataFrame({
"日期": pd.date_range("2026-01-01", periods=90, freq="D"),
"销售额": [120 + i * 0.5 + (i % 7) * 3 for i in range(90)],
"访问量": [800 + i * 2 + (i % 5) * 10 for i in range(90)],
})
df.to_excel(path, index=False)
print(f"已生成示例数据文件 {path}")
def draw_trend_from_excel(excel_path):
ensure_sample_excel(excel_path)
# 读取Excel
df = pd.read_excel(excel_path)
print("列名:", df.columns.tolist())
print("数据行数:", len(df))
# 把日期列转成datetime并排序
df["日期"] = pd.to_datetime(df["日期"])
df = df.sort_values("日期")
# 创建画布,双Y轴
fig, ax1 = plt.subplots(figsize=(12, 6))
# 左轴:销售额
color1 = "#4C72B0"
ax1.plot(df["日期"], df["销售额"], color=color1, linewidth=2, label="销售额")
ax1.set_xlabel("日期", fontsize=12)
ax1.set_ylabel("销售额(万元)", color=color1, fontsize=12)
ax1.tick_params(axis="y", labelcolor=color1)
# 旋转X轴日期标签
fig.autofmt_xdate(rotation=45)
# 右轴:访问量
ax2 = ax1.twinx()
color2 = "#C44E52"
ax2.plot(df["日期"], df["访问量"], color=color2, linewidth=2, linestyle="--", label="访问量")
ax2.set_ylabel("访问量(次)", color=color2, fontsize=12)
ax2.tick_params(axis="y", labelcolor=color2)
plt.title("基于Excel数据的销售趋势图", fontsize=16)
plt.tight_layout()
plt.savefig("excel_trend.png", dpi=150)
plt.close()
print("趋势图已保存为 excel_trend.png")
if __name__ == "__main__":
draw_trend_from_excel("sales_data.xlsx")
代码讲解
ensure_sample_excel()是个兜底逻辑:如果目录下没有Excel文件,先生成一个90天的示例数据,保证脚本直接能跑通;实际使用时把你自己的Excel放进去就行。pd.read_excel()读取xlsx文件,底层依赖openpyxl引擎,所以要装openpyxl。pd.to_datetime()把Excel里的日期字符串转成datetime类型,matplotlib才能按时间轴正确排序;sort_values("日期")防止Excel里数据顺序乱。ax1.twinx()做双Y轴,左轴销售额、右轴访问量,两个指标量级差很多,放一个轴上会压扁一条线。fig.autofmt_xdate(rotation=45)自动把X轴日期标签斜着排,90天的日期横着排会重叠。
运行结果
当前目录先自动生成 sales_data.xlsx(如果不存在),然后生成 excel_trend.png。图中蓝色实线是销售额趋势(左轴),红色虚线是访问量趋势(右轴),横轴是90天日期。打开图片确认两条线走势和Excel数据一致。
注意事项
- Excel列名必须和代码里
df["日期"]、df["销售额"]完全一致,中文列名注意别带空格。 - 如果Excel第一个sheet不是数据表,用
pd.read_excel(path, sheet_name="Sheet2")指定。 - 数据里有空值时,折线会断掉,加一行
df = df.dropna(subset=["销售额"])删掉空行。 - 读xlsx不要用xlrd库,新版xlrd不支持xlsx,必须用openpyxl。

更新时间:2026-09-14 20:32:59
上一篇:Python matplotlib画柱状图:分组对比柱状图实例