You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Matplotlib导出PDF时绘图线条存在精度偏差问题咨询

Matplotlib 3.6.1生成PDF时线条与数据点的精度偏差问题

问题现象

在Matplotlib 3.6.1版本中生成PDF文件时,plt.plot()绘制的线条会出现微小精度偏差,与plt.scatter()绘制的原始数据点无法对齐。高DPI的PNG格式输出无此错位问题,更换绘图后端也无法改善该现象。在实际场景中,使用plt.fill_between()与plt.plot()绘制同一线条时,PDF中的偏差甚至无需放大即可直接察觉。

复现示例

示例1:使用真实数据

import pandas as pd
import matplotlib as mlp
mlp.use("Agg")
import matplotlib.pyplot as plt

df = pd.read_csv("my_data.csv")

fig = plt.figure(figsize=(1.5,1.5))
plt.plot(df['X'], df['Y'], color='b', linewidth=0.1)
plt.scatter(df['X'], df['Y'], color='k', s=0.05, linewidths=0)
fig.savefig("res.pdf")
fig.savefig("res.png", dpi=5000)
  • PDF输出:蓝色线条与黑色数据点存在错位,放大后偏差明显
  • PNG输出:同区域放大后线条与数据点完全对齐

示例2:使用生成数据

import numpy as np
import matplotlib as mlp
mlp.use("Agg")
import matplotlib.pyplot as plt

fig = plt.figure(figsize=(1.0,1.5))
X = np.arange(0,12,0.01)
data = np.sin(X) + np.random.normal(0, 0.005, (len(X),))
plt.plot(X, data, color='b', linewidth=0.06)
plt.scatter(X, data, color='k', s=0.05, linewidths=0)
fig.savefig("res.pdf")
  • PDF输出:放大后可见蓝色线条与黑色数据点错位

示例3:fill_between与plot的偏差

使用plt.fill_between()和plt.plot()绘制同一数据的线条时,PDF中两者的偏差肉眼可见。

原因分析

该偏差源于Matplotlib的PDF后端为了优化文件大小和渲染性能,对绘制路径进行了坐标量化与路径简化操作:

  • plt.plot()生成的是连续路径,PDF后端会对路径的坐标点进行取整或简化,导致线条位置出现微小偏移;
  • plt.scatter()是直接绘制单个离散点,使用的是原始精确坐标,不会被路径简化操作影响;
  • PNG为栅格化输出,直接基于精确坐标渲染像素,因此不会出现此类偏差。

解决方法

1. 禁用路径简化

通过修改Matplotlib配置参数,关闭路径简化功能,保留精确坐标:

import matplotlib as mpl
mpl.rcParams['path.simplify'] = False

此方法会确保线条使用原始精确坐标绘制,但可能导致PDF文件体积增大。

2. 调整路径简化阈值

如果不想完全关闭路径简化,可以降低简化阈值,减少坐标偏移程度:

import matplotlib as mpl
mpl.rcParams['path.simplify_threshold'] = 0.0  # 设置为0可最大化精度

3. 更新Matplotlib版本

后续版本的Matplotlib对PDF后端的精度处理进行了优化,升级到最新稳定版本可能直接解决该问题。

4. 使用矢量图后端的精确模式

切换到Matplotlib原生的PDF后端,并开启高精度模式:

import matplotlib as mpl
mpl.use('PDF')  # 替代Agg后端
mpl.rcParams['pdf.fonttype'] = 42  # 使用TrueType字体,避免额外的坐标转换

内容的提问来源于stack exchange,提问作者chillibaba

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 20:10:28