我不明白为什么下面的另存为PDF与PNG不同。最小的例子是:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
import matplotlib.patches as mpatches
def gradient_fill_rect(xy, dx,dy, fill_color=None, ax=None, speed=10 ,**kwargs):
if ax is None:
ax = plt.gca()
x,y=xy
line, = ax.plot(x, y,color='#00000000')
if fill_color is None:
fill_color = line.get_color()
zorder = line.get_zorder()
alpha = line.get_alpha()
alpha = 1.0 if alpha is None else alpha
z = np.empty((50, 50, 4), dtype=float)
rgb = mcolors.colorConverter.to_rgb(fill_color)
z[:,:,:3] = rgb
xc=x+dx/2
yc=y+dy/2
XX,YY=np.meshgrid(np.linspace(x,x+dx),np.linspace(y,y+dy))
z[:,:,-1]=np.exp(-(((XX-xc)/dx)**2+((YY-yc)/dy)**2)*speed)
xmin, xmax, ymin, ymax = x,x+dx,y,y+dy
im = ax.imshow(z, aspect='auto', extent=[xmin, xmax, ymin, ymax],
origin='lower', zorder=zorder)
clip_path = mpatches.FancyBboxPatch([x,y],dx,dy,facecolor='none', edgecolor='none',**kwargs)
ax.add_patch(clip_path)
im.set_clip_path(clip_path)
return line, im
fig,ax=plt.subplots()
gradient_fill_rect([0., 0.2], 0.4,.5, 'y', ax=None, speed=2,boxstyle=mpatches.BoxStyle("Round", pad=0,rounding_size=0.2))
gradient_fill_rect([0.5, 0.2], 0.4,.5, 'y', ax=None, speed=2,boxstyle=mpatches.BoxStyle("Round", pad=0,rounding_size=0.2))
ax.set_xlim(0,1)
ax.set_ylim(0,1)
ax.text(.4,.4,'text')
fig.savefig('t.pdf',dpi=1000)
首先,如果我将它导出到PNG fig.savefig('t.png',dpi=1000)
,这是正确的,它看起来像
但是如果我将其导出为PDF fig.savefig('t.pdf',dpi=1000)
,im.set_clip_path
似乎不起作用。快照如下所示:
Someone提到了栅格化的ax.set_rasterized(True)
。它强制PDF光栅化,然而,它也光栅化文本,我希望它保持矢量化。
发布于 2020-12-23 00:12:54
默认情况下,在将图形另存为矢量图形文件(如pdf )之前,所有图像都将合并为单个合成图像(请参阅matplotlib PR 4061)。对于多个图像,您可能希望将其关闭:
with plt.rc_context({'image.composite_image': False}):
fig.savefig('t.pdf',dpi=1000)
(如果你只有一个渐变填充的矩形,它将在True
的标准设置下正常工作。恐怕我不知道确切的原因,它显然与绘图中的多个剪辑路径相关联。)
https://stackoverflow.com/questions/65376473
复制相似问题