栅格化错误栏时的丑陋轮廓
Ugly Outline When Rasterizing Errorbar
我正在使用 Matplotlib(版本 2.2.5)绘制大量有错误的数据点,并且我正在栅格化数据,因为有几千个数据点。然而,我发现当我将数据栅格化并另存为 PDF 时,错误栏会产生一个难看的白色轮廓,这是不可接受的。我构建了一个显示问题的 MWE:
import numpy as np
import random as rand
import matplotlib.pyplot as plt
rand.seed(10)
seeds = range(0, 1000)
data = np.empty((len(seeds), 2))
for n in seeds:
data[n, 0] = rand.gauss(1, 0.01)
data[n, 1] = rand.gauss(1, 0.01)
fig, ax = plt.subplots(1, 1, figsize=(6, 6))
ax.scatter(data[:, 0], data[:, 1], s=10, facecolors="k", rasterized=True, zorder=1)
ax.errorbar(data[:, 0], data[:, 1], xerr=0.01, yerr=0.01, color="k", fmt="none", rasterized=True, zorder=2)
fig.savefig("Test.pdf", dpi=250)
这在 Jupyter Notebook 输出中以及保存的 PNG 文件中看起来都不错。然而,输出的 PDF 文件看起来像这样:
我如何摆脱错误栏引起的白色绒毛?如果我不光栅化,问题就消失了,但是文件加载到我的论文中需要很长时间,我最不想做的就是惹恼我的 reader.
感谢 ,我找到了解决方案:我需要将 ax.set_rasterization_zorder(0)
添加到代码中,并将绘制点的 zorder 更改为低于 0。这产生了一个完美的图形,没有丑陋的数据轮廓并保留矢量化轴,这正是我想要的。工作代码是:
import numpy as np
import random as rand
import matplotlib.pyplot as plt
rand.seed(10)
seeds = range(0, 1000)
data = np.empty((len(seeds), 2))
for n in seeds:
data[n, 0] = rand.gauss(1, 0.01)
data[n, 1] = rand.gauss(1, 0.01)
fig, ax = plt.subplots(1, 1, figsize=(6, 6))
ax.scatter(data[:, 0], data[:, 1], s=10, facecolors="k", rasterized=True, zorder=-2)
ax.errorbar(data[:, 0], data[:, 1], xerr=0.01, yerr=0.01, color="k", fmt="none", rasterized=True, zorder=-1)
ax.set_rasterization_zorder(0)
fig.savefig("Test.pdf", dpi=250)
输出为:
我正在使用 Matplotlib(版本 2.2.5)绘制大量有错误的数据点,并且我正在栅格化数据,因为有几千个数据点。然而,我发现当我将数据栅格化并另存为 PDF 时,错误栏会产生一个难看的白色轮廓,这是不可接受的。我构建了一个显示问题的 MWE:
import numpy as np
import random as rand
import matplotlib.pyplot as plt
rand.seed(10)
seeds = range(0, 1000)
data = np.empty((len(seeds), 2))
for n in seeds:
data[n, 0] = rand.gauss(1, 0.01)
data[n, 1] = rand.gauss(1, 0.01)
fig, ax = plt.subplots(1, 1, figsize=(6, 6))
ax.scatter(data[:, 0], data[:, 1], s=10, facecolors="k", rasterized=True, zorder=1)
ax.errorbar(data[:, 0], data[:, 1], xerr=0.01, yerr=0.01, color="k", fmt="none", rasterized=True, zorder=2)
fig.savefig("Test.pdf", dpi=250)
这在 Jupyter Notebook 输出中以及保存的 PNG 文件中看起来都不错。然而,输出的 PDF 文件看起来像这样:
感谢 ax.set_rasterization_zorder(0)
添加到代码中,并将绘制点的 zorder 更改为低于 0。这产生了一个完美的图形,没有丑陋的数据轮廓并保留矢量化轴,这正是我想要的。工作代码是:
import numpy as np
import random as rand
import matplotlib.pyplot as plt
rand.seed(10)
seeds = range(0, 1000)
data = np.empty((len(seeds), 2))
for n in seeds:
data[n, 0] = rand.gauss(1, 0.01)
data[n, 1] = rand.gauss(1, 0.01)
fig, ax = plt.subplots(1, 1, figsize=(6, 6))
ax.scatter(data[:, 0], data[:, 1], s=10, facecolors="k", rasterized=True, zorder=-2)
ax.errorbar(data[:, 0], data[:, 1], xerr=0.01, yerr=0.01, color="k", fmt="none", rasterized=True, zorder=-1)
ax.set_rasterization_zorder(0)
fig.savefig("Test.pdf", dpi=250)
输出为: