python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python Excel图表导出为图片

Python实现将Excel图表导出并保存为图片

作者:杨利杰YJlio

还在为Python图表导出后模糊、裁切烦恼吗,本文详细对比PNG、JPG、SVG、PDF的适用场景,并教你用dpi、bbox_inches等参数轻松导出高清图表,无论是写博客、做PPT还是正式报告,都能让你的图表清晰可复用,真正提升办公自动化交付质量

前言

这一篇主要解决的问题很明确:Python 生成图表之后,如何把图表保存成清晰、稳定、可复用、可交付的图片文件。

很多人学习 Matplotlib 时,只关注 plt.plot()plt.bar()plt.show(),但真实办公自动化里,只会显示图表是不够的。图表最终要放进 Word、PPT、Excel、CSDN 博客、测试报告或者领导汇报材料里,所以导出质量直接影响交付质量。

我的理解是:画图是“生成结果”,导出图表才是“形成交付物”。如果图画得很漂亮,但保存出来模糊、裁切、发灰、边缘锯齿严重,那前面的数据分析和图表设计都会被削弱。

这张图展示了本文的核心主题:Python 读取数据、Matplotlib 生成图表,最后把图表导出为可复用图片文件。

从这张图中我们可以看出,本文不是单纯讲“怎么画图”,而是把重点放在图表导出、图片复用、交付质量这条链路上。对办公自动化来说,这一步非常关键。

读完这一篇,至少要带走三件事:

  1. 知道 PNG、JPG、SVG、PDF 这些格式应该怎么选;
  2. 知道 dpibbox_inchestransparent 这些参数分别解决什么问题;
  3. 能把图表导出逻辑封装成函数,后续批量生成图表时直接复用。

2. 图表保存格式怎么选:PNG、JPG、SVG、PDF 的区别

Matplotlib 保存图表最常用的函数是 savefig()。它的使用方式很简单:你写什么文件后缀,它就按对应格式保存。

plt.savefig("out.jpg")
plt.savefig("out.jpg")
plt.savefig("out.svg")
plt.savefig("out.pdf")

但是这里有个坑:能保存,不代表适合保存。不同格式的用途不一样,选错格式,图片质量会明显下降。

这张图展示了常见导出格式的选择逻辑:PNG、JPG、SVG、PDF 分别适合不同交付场景。

从这张图中我们可以看出,图表导出不能只看“能不能打开”,还要看是否清晰、是否无损、是否适合打印、是否适合后期编辑。这也是很多新手保存图表后觉得“图片发糊”的根本原因。

2.1 PNG:最推荐的默认格式

PNG 是我最推荐的图表导出格式。它属于无损压缩格式,适合保存图表、截图、界面图、流程图、数据分析图。

推荐场景:

如果没有特殊需求,图表导出优先选 PNG,这是最稳的做法。

2.2 JPG/JPEG:不适合保存图表

JPG 更适合照片,不适合保存线条图、文字图和图表。因为 JPG 是有损压缩,压缩后文字边缘、坐标轴、线条容易发虚。

如果图表里有文字、坐标轴、细线条,不建议用 JPG。

2.3 SVG:适合矢量图和后期编辑

SVG 是矢量格式,最大的优势是放大不糊。如果后续要放进设计软件、做高质量排版、或者需要后期编辑图形元素,SVG 很合适。

可以把 SVG 理解成“用路径和形状描述出来的图”,不是传统意义上的像素图片。

2.4 PDF:适合正式报告和打印归档

PDF 适合正式报告、归档和打印。如果你的图表是给领导汇报、项目报告、测试报告使用,PDF 格式会更稳定。

我的实际选择习惯是:

使用场景推荐格式
CSDN博客 / PPT / WordPNG
正式报告 / 打印 / 归档PDF
需要放大不糊 / 后期编辑SVG
照片类内容JPG

3. 控制图表保存质量:dpi、bbox_inches、transparent

保存图表时,最常见的问题不是代码报错,而是保存出来的图片不够清楚。这类问题通常和三个参数有关:

这张图展示了导出高清图表时最关键的三个参数:dpi、bbox_inches 和 transparent。

从这张图中我们可以看出,图表清晰度不是靠截图解决的,而是要在保存阶段就设置好参数。截图只是临时办法,savefig 才是标准导出方式。

3.1 最常用的高清保存模板

下面这段代码是我建议长期复用的基础模板。

import matplotlib.pyplot as plt

# 示例数据
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]

plt.figure(figsize=(9, 6))
plt.plot(x, y, marker="o", linewidth=2)

plt.title("示例:导出清晰图表")
plt.xlabel("X轴")
plt.ylabel("Y轴")
plt.grid(True, linestyle="--", alpha=0.35)
plt.tight_layout()

plt.savefig(
    "out/图表.jpg",
    dpi=200,
    bbox_inches="tight"
)

plt.close()

这段代码里最关键的是 plt.savefig() 这一段。它决定了图表最终保存出来的质量,而不是单纯决定“文件能不能生成”。

3.2 dpi 应该设置多少?

dpi 可以理解成图片的输出精度。dpi 越高,图片越清晰,但文件体积也会变大。

我的经验值如下:

场景推荐 dpi
普通博客配图150~200
PPT汇报 / 大屏展示200~300
正式打印 / 报告归档300
临时测试图100~150

日常办公自动化里,我一般默认设置为 dpi=200,清晰度和文件体积比较平衡。

3.3 bbox_inches=“tight”:解决边缘空白和裁切问题

有些图保存出来后,四周空白很多;有些图的标题、标签又容易被切掉。这时就可以使用:

plt.savefig("out/图表.jpg", bbox_inches="tight")

这个参数建议长期保留。它可以自动处理图表边界,让导出的图片更紧凑。

3.4 transparent=True:透明背景适合 PPT 贴图

如果你要把图表放到深色 PPT、技术海报、封面图里,透明背景会更灵活。

plt.savefig(
    "out/透明背景图表.jpg",
    dpi=200,
    bbox_inches="tight",
    transparent=True
)

注意:透明背景不一定适合所有场景。如果图表本身依赖白色背景、网格线较浅,透明后可能会看不清。是否使用透明背景,要结合最终展示环境判断。

4. 标准导出流程:从画图到保存文件

我建议把 Matplotlib 图表导出理解成一个固定流程,而不是写一行 savefig() 就结束。

这个流程里有两个细节很重要:

  1. 保存前建议使用 plt.tight_layout()
  2. 保存后建议使用 plt.close()

原因很简单:tight_layout() 用来减少标题、坐标轴、图例被挤压或裁切的风险;close() 用来关闭当前图表,避免批量生成图表时内存不断占用。

4.1 一个更规范的导出示例

import matplotlib.pyplot as plt
from pathlib import Path

def save_demo_chart(out_path: str):
    out = Path(out_path)
    out.parent.mkdir(parents=True, exist_ok=True)

    x = ["1月", "2月", "3月", "4月", "5月", "6月"]
    y = [120, 98, 135, 110, 150, 160]

    plt.figure(figsize=(9, 6))
    plt.plot(x, y, marker="o", linewidth=2, label="工单数量")

    plt.title("月度工单数量趋势")
    plt.xlabel("月份")
    plt.ylabel("工单数量(单)")
    plt.grid(axis="y", linestyle="--", alpha=0.35)
    plt.legend()
    plt.tight_layout()

    plt.savefig(out, dpi=200, bbox_inches="tight")
    plt.close()

if __name__ == "__main__":
    save_demo_chart("out/月度工单数量趋势.jpg")
    print("✅ 图表已导出")

这段代码相比直接写 plt.savefig("图表.jpg") 更适合真实工作,因为它提前创建了输出目录,并且在导出后关闭了图表对象。

推荐你以后写办公自动化脚本时,尽量采用这种函数化写法。

5. 一次性导出多种格式:PNG + PDF + SVG

在真实交付中,经常会遇到这种情况:

如果每次都手动改后缀保存,就很低效。更好的做法是:同一张图一次性导出多种格式。

这张图展示了一键多格式导出的思路:一张 Python 图表,同时输出 PNG、PDF、SVG,满足不同交付场景。

从这张图中我们可以看出,多格式导出的价值不是“炫技”,而是提高交付稳定性。当你提前准备好 PNG、PDF、SVG,后续不管是发博客、写报告还是做设计,都不会临时返工。

5.1 多格式导出函数

import matplotlib.pyplot as plt
from pathlib import Path

def save_multi_formats(fig, out_dir: str, base_name: str, dpi: int = 200):
    """
    将同一张图表同时导出为 PNG、PDF、SVG
    """
    out = Path(out_dir)
    out.mkdir(parents=True, exist_ok=True)

    fig.savefig(out / f"{base_name}.jpg", dpi=dpi, bbox_inches="tight")
    fig.savefig(out / f"{base_name}.pdf", bbox_inches="tight")
    fig.savefig(out / f"{base_name}.svg", bbox_inches="tight")

# 示例
fig, ax = plt.subplots(figsize=(9, 6))

x = ["1月", "2月", "3月", "4月", "5月", "6月"]
y = [120, 98, 135, 110, 150, 160]

ax.plot(x, y, marker="o", linewidth=2, label="工单数量")
ax.set_title("月度工单数量趋势")
ax.set_xlabel("月份")
ax.set_ylabel("工单数量(单)")
ax.grid(axis="y", linestyle="--", alpha=0.35)
ax.legend()

save_multi_formats(fig, "out", "月度工单数量趋势", dpi=200)
plt.close(fig)

print("✅ 已导出 PNG / PDF / SVG")

这段代码的好处是很明显的:画图逻辑只写一次,保存逻辑统一管理。

如果你后续在做自动化日报、周报、测试报告,这种写法会比手动保存稳定得多。

6. 批量生成图表并导出:从“单张图”升级到“自动化交付”

单张图导出只是入门。真正有价值的是批量导出,比如:

这张图展示了批量导出图表的自动化思路:读取配置、生成多张图表、统一保存到输出目录。

从这张图中我们可以看出,批量导出图表的重点是函数化、自动化、可交付。如果每张图都手工生成,效率很低,也容易出错;如果用函数统一管理,后续只需要改数据源和配置即可。

6.1 批量导出函数骨架

import matplotlib.pyplot as plt
from pathlib import Path

def export_one_chart(title: str, x, y, out_path: str):
    """
    导出单张图表
    """
    out = Path(out_path)
    out.parent.mkdir(parents=True, exist_ok=True)

    fig, ax = plt.subplots(figsize=(9, 6))

    ax.plot(x, y, marker="o", linewidth=2, label=title)
    ax.set_title(title)
    ax.set_xlabel("月份")
    ax.set_ylabel("数量")
    ax.grid(axis="y", linestyle="--", alpha=0.35)
    ax.legend()

    fig.savefig(out, dpi=200, bbox_inches="tight")
    plt.close(fig)

def batch_export_charts():
    """
    批量导出多张图表
    """
    months = ["1月", "2月", "3月", "4月", "5月", "6月"]

    chart_configs = [
        {
            "title": "软件类工单趋势",
            "data": [40, 35, 50, 45, 60, 55],
            "file": "out/软件类工单趋势.jpg"
        },
        {
            "title": "硬件类工单趋势",
            "data": [80, 63, 85, 65, 90, 105],
            "file": "out/硬件类工单趋势.jpg"
        },
        {
            "title": "网络类工单趋势",
            "data": [15, 10, 18, 12, 20, 22],
            "file": "out/网络类工单趋势.jpg"
        }
    ]

    for item in chart_configs:
        export_one_chart(
            title=item["title"],
            x=months,
            y=item["data"],
            out_path=item["file"]
        )

if __name__ == "__main__":
    batch_export_charts()
    print("✅ 批量图表导出完成")

这个批量导出骨架非常适合继续扩展,比如后续可以把 chart_configs 改成从 Excel、JSON 或数据库读取。

推荐做法:不要把所有图表代码堆在一个脚本里,而是拆成“生成图表函数 + 批量配置 + 输出目录”三部分。

7. 常见问题与踩坑记录

7.1 为什么保存出来的图片还是模糊?

优先检查这几个点:

  1. 是否保存成了 JPG;
  2. dpi 是否太低;
  3. figsize 是否太小;
  4. 是否使用截图代替了 savefig()
  5. 图片是否被微信、网页、平台二次压缩。

如果是图表类图片,优先使用 PNG,并设置 dpi=200 或 300。

7.2 为什么标题或坐标轴被裁掉?

通常是布局没有调整好。建议组合使用:

plt.tight_layout()
plt.savefig("out.jpg", bbox_inches="tight")

如果图例放在图表外部,仍然可能被裁切,这时需要额外调整画布大小或图例位置。

7.3 为什么中文标题显示成方块?

这是中文字体配置问题,不是导出函数的问题。可以在脚本开头增加:

import matplotlib.pyplot as plt

plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

第一行解决中文显示问题,第二行解决负号显示异常问题。

7.4 为什么批量导出时越来越慢?

很可能是每次生成图表后没有关闭图表对象。批量循环时一定要执行:

plt.close()

如果使用 fig, ax = plt.subplots() 的写法,则建议:

plt.close(fig)

批量生成图表时,不关闭图表对象,可能导致内存占用越来越高。

8. 效果验证:导出后应该检查什么?

很多人写脚本时只看控制台有没有报错,但这不够。图表导出类脚本,至少要检查以下几个结果。

8.1 检查文件是否生成

首先确认目标目录下是否真的生成了文件,例如:

out/月度工单数量趋势.jpg
out/月度工单数量趋势.pdf
out/月度工单数量趋势.svg

8.2 检查图片是否清晰

打开图片后放大查看:

8.3 检查图片是否被裁切

重点看:

8.4 检查是否适合实际交付

最后要把图放进真实使用场景里看,例如:

真正的验证,不是脚本运行成功,而是图片进入交付材料后依然清晰可读。

9. 我的总结提升

这一篇的核心,不是简单记住 savefig() 这个函数,而是理解图表导出的完整交付逻辑。

在 Python 办公自动化里,图表生成通常只是中间步骤。真正面向工作结果时,我们要关注的是:

  1. 图表能不能被清晰保存;
  2. 图片能不能复用到报告、PPT、博客里;
  3. 导出逻辑能不能批量化;
  4. 后续别人拿到文件后,能不能直接使用。

我建议把图表导出当成一个固定模块沉淀下来。以后无论是折线图、柱形图、饼图、组合图,最后都统一走同一套导出函数,这样脚本结构更干净,也更容易维护。

如果只会画图,不会高质量导出,图表就还停留在“演示阶段”;只有能稳定保存、复用、交付,才算真正进入办公自动化阶段。

所以我从这一节带走的工作级结论是:图表不是画出来就结束,而是导出后还能清晰传播,才算完成。

10. 发布版补充:我建议这样使用这篇笔记

这一节在书籍学习路径中属于图表输出能力的补充内容,但它的实用价值非常高。因为在真实办公场景里,图表通常不是给自己看的,而是要进入报告、汇报、博客和交付文件。

我建议后续所有 Matplotlib 图表脚本都统一加入以下导出标准:

plt.savefig(
    "out/图表.jpg",
    dpi=200,
    bbox_inches="tight"
)
plt.close()

如果是正式报告或长期复用场景,可以进一步升级为:

fig.savefig("out/图表.jpg", dpi=200, bbox_inches="tight")
fig.savefig("out/图表.pdf", bbox_inches="tight")
fig.savefig("out/图表.svg", bbox_inches="tight")
plt.close(fig)

这类小细节看起来不复杂,但会直接影响交付质量。尤其是你长期写 Python + Excel 自动化读书笔记时,把这些标准动作沉淀下来,后续每一篇文章、每一个脚本都会更稳。

到此这篇关于Python实现将Excel图表导出并保存为图片的文章就介绍到这了,更多相关Python Excel图表导出为图片内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文