当打印到Pdf时,Matplotlib线似乎不准确



使用plt.plot()生成带有Matplotlib的Pdfs时,似乎存在一些非常小的不准确性。在下面的例子中,我有一些简单的例子,其中用plt.plot()绘制的线与用plt.scatter()绘制的原始数据点不对齐。这些差异很小,但当仔细观察Pdf时,仍然可以在论文等中注意到。我使用的是Matplotlib 3.6.1。

示例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:Pdf图1

让我们放大Pdf中的一些细节(黑点和蓝线未对齐(:Pdf图1缩放

Png中的同一段(所有内容都对齐(:Png图1缩放

示例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:Pdf图2

让我们放大Pdf中的一些细节(黑点和蓝线未对齐(:Pdf图2缩放

示例3

上面提到的偏差很小,但实际上在一些真实世界的例子中是可见的。在下面的图中,我使用了plt.fill_between(),并使用plt.plot()绘制了完全相同的线。在这种情况下,线条的不精确性将在Pdf中直接可见,而无需放大:Pdf图3

问题:

对我来说,这种行为非常令人惊讶。PNG图(具有高DPI(没有显示错位。这是怎么回事?更改后端似乎并不能改善结果。有没有办法让这些情节更加"准确"?

类似问题:链接

事实证明,当图形很小,数据非常密集时,Matplotlib会简化路径,请参阅此处和此处的详细信息。

简化的工作方式是将线段迭代合并为单个矢量,直到下一个线段与矢量的垂直距离(在显示坐标空间中测量(大于path.simplify_threshold parameter。Matplotlib当前默认为1/9的保守简化阈值。

要提高小绘图的绘图精度,请将阈值更改为小值,例如

mlp.rcParams["path.simplify_threshold"] = 0.01

或者只是关闭路径简化:

mpl.rcParams['path.simplify'] = False

最新更新