当前位置:首页>python>Python:Matplotlib 解决中文乱码+PDF导出高清矢量图

Python:Matplotlib 解决中文乱码+PDF导出高清矢量图

  • 2026-10-19 06:09:11
Python:Matplotlib 解决中文乱码+PDF导出高清矢量图
Matplotlib默认不支持中文,图表导出PDF出现方框乱码,导出图片模糊是数据分析高频踩坑问题。本篇完成全局字体配置,实现中文正常渲染,输出高清矢量PDF、高DPI图片,适配报告自动导出业务。
场景:数据分析脚本自动生成业务柱状图,输出PDF报表给业务方,要求中文标题坐标轴正常,PDF放大不模糊。

代码示例

import matplotlib.pyplot as pltimport numpy as np# ========== 1. 全局字体配置,解决中文乱码 ==========plt.rcParams["font.sans-serif"] = ["SimHei"]  # 使用黑体渲染中文plt.rcParams["axes.unicode_minus"] = False    # 解决负号显示为方块的问题# ========== 2. 生成随机漫步数据(模拟50000步) ==========num_points = 50000x_values = [0]y_values = [0]for _ in range(num_points):    x_step = np.random.choice([-1, 1]) * np.random.randint(0, 5)    y_step = np.random.choice([-1, 1]) * np.random.randint(0, 5)    # 过滤原地踏步的情况    if x_step == 0 and y_step == 0:        continue    x_values.append(x_values[-1] + x_step)    y_values.append(y_values[-1] + y_step)# ========== 3. 绘制高级感散点图 ==========fig, ax = plt.subplots(figsize=(14, 9), dpi=128)# 核心:使用颜色映射(cmap)体现漫步的先后顺序point_numbers = range(len(x_values))ax.scatter(x_values, y_values, c=point_numbers, cmap=plt.cm.Blues,           edgecolors='none', s=2, alpha=0.8)# 突出起点与终点ax.scatter(0, 0, c='green', edgecolors='none', s=100, label='起点')ax.scatter(x_values[-1], y_values[-1], c='red', edgecolors='none', s=100, label='终点')# 添加中文标题与图例ax.set_title("随机漫步轨迹模拟 (50,000步)", fontsize=18, pad=20)ax.legend(loc="upper right", fontsize=12)# 隐藏坐标轴,增强纯粹的视觉美感ax.get_xaxis().set_visible(False)ax.get_yaxis().set_visible(False)# ========== 4. 导出高清图表 ==========# 导出高清PNG位图,适合网页展示plt.savefig("random_walk.png", dpi=300, bbox_inches="tight")# 导出矢量PDF,放大不失真,适合专业报表plt.savefig("random_walk.pdf", bbox_inches="tight")plt.close()
输出结果

核心总结

1. 全局中文渲染配置

  • 字体指定:通过 plt.rcParams["font.sans-serif"] = ["SimHei"] 强制指定无衬线字体为黑体,解决 Matplotlib 默认不支持中文导致显示为方框的问题。
  • 负号修复:设置 plt.rcParams["axes.unicode_minus"] = False,防止坐标轴上的负号(-)被错误渲染为方块。

2. 商业级柱状图美化技巧

  • 去除粗边框:在 ax.bar() 中设置 edgecolor="none",去掉柱子默认的黑色描边,使图表视觉更现代、干净。
  • 数据标签自动标注:利用 bar.get_height() 获取柱子高度,结合 ax.text() 循环在柱子顶部精准添加格式化数值(如 f'{height:,.0f}'),提升报表可读性。
  • 极简边框设计:使用 ax.spines['top'].set_visible(False) 隐藏图表上方和右侧的冗余边框,符合现代数据可视化“少即是多”的原则。
  • 背景网格线:通过 ax.yaxis.grid(True, linestyle='--', alpha=0.5) 添加半透明虚线网格,并使用 ax.set_axisbelow(True) 确保网格线渲染在柱子底层,不干扰数据展示。

3. 图表导出与防截断机制

  • 防截断参数:在 plt.savefig() 中加入 bbox_inches="tight",让 Matplotlib 自动收紧画布边缘,彻底解决长标题、图例或数据标签被意外裁剪的痛点。
  • 高分辨率位图:设置 dpi=300 导出 PNG 格式,确保图表在网页、PPT 或普通文档中清晰展示。
  • 矢量图导出:直接导出 PDF 格式。矢量图由数学公式定义而非像素点,无论放大多少倍都不会失真,是专业数据报告和印刷品的首选格式。

4. 核心最佳实践

  • 配置前置原则:所有的 rcParams 全局配置必须在执行任何绘图代码之前设置,以确保样式全局生效。
  • 资源释放:在图表保存完毕后,务必调用 plt.close() 释放内存,这在批量生成图表或自动化报表脚本中尤为重要,可有效防止内存泄漏。

    最新文章

    随机文章