我的知识记录

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。

Python根据Excel数据画趋势图:pandas读取matplotlib出图

标签:

更新时间:2026-09-14 20:32:59

上一篇:Python matplotlib画柱状图:分组对比柱状图实例

下一篇:Python图表叠加柱状图折线图组合图:双轴混合图表