seaborn 中的非透明置信区间

Non-transparent confidence intervals in seaborn

上下文:
我想投稿的期刊只接受 .tiff(不适用于 LaTeX)、.jpg(不适用于图表)和 .eps(不适用于 LaTeX) alpha 透明度,除非我将图像栅格化,这会导致巨大的文件大小)。我的许多绘图都使用 seaborn 的 regplot,它绘制了透明的置信区间。是否可以在不完全手动重新绘制所有图形的情况下绘制非透明 CI(例如,背景中的虚线或纯色)?

示例:

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

sns.set_style("ticks")
np.random.seed(0)
n = 50

fig, ax = plt.subplots(figsize=(8,6))

x = np.random.randn(n)
y1 = np.random.randn(n)
y2 = np.random.randn(n)

sns.regplot(x, y1, ax=ax)
sns.regplot(x, y2, ax=ax)

plt.show()

在不丢失重叠置信区间信息的情况下,将其另存为 .eps 文件的最简单/最佳方法是什么?

问题是您需要透明度来显示重叠的两个置信区间。需要将图像光栅化。

如果期刊接受,我实际上没有看到使用 jpg 的问题。您可以使用

控制图像的质量
plt.savefig(__file__+".jpg", quality=95)

也可以使用 eps,在这里,您可以只对置信区间 fill_between 曲线进行栅格化,而不是对所有内容进行栅格化。优点是轴、标签和点仍然是矢量图形,在不同的缩放级别上看起来不会像素化。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.collections import PolyCollection as p
import seaborn as sns

sns.set_style("ticks")
np.random.seed(0)
n = 50

fig, ax = plt.subplots(figsize=(8,6))

x = np.random.randn(n)
y1 = np.random.randn(n)
y2 = np.random.randn(n)

sns.regplot(x, y1, ax=ax)
sns.regplot(x, y2, ax=ax)

plt.savefig(__file__+".jpg", quality=95)
for c in ax.findobj(p):
    c.set_zorder(-1)
    c.set_rasterized(True)
#everything on zorder -1 or lower will be rasterized
ax.set_rasterization_zorder(0)

plt.savefig(__file__+".eps")
plt.savefig(__file__+".png")
plt.show()

最终的 eps 文件如下所示:

虽然文件大小当然有点大,但我不确定这是否是一个真正的问题。