使用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