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
相关产品推荐
相关产品推荐

