首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么在matplotlib中保存为PDF有时与PNG不同?

为什么在matplotlib中保存为PDF有时与PNG不同?
EN

Stack Overflow用户
提问于 2020-12-20 10:40:34
回答 1查看 106关注 0票数 0

我不明白为什么下面的另存为PDF与PNG不同。最小的例子是:

代码语言:javascript
运行
复制
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光栅化,然而,它也光栅化文本,我希望它保持矢量化。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-23 00:12:54

默认情况下,在将图形另存为矢量图形文件(如pdf )之前,所有图像都将合并为单个合成图像(请参阅matplotlib PR 4061)。对于多个图像,您可能希望将其关闭:

代码语言:javascript
运行
复制
with plt.rc_context({'image.composite_image': False}):
    fig.savefig('t.pdf',dpi=1000)

(如果你只有一个渐变填充的矩形,它将在True的标准设置下正常工作。恐怕我不知道确切的原因,它显然与绘图中的多个剪辑路径相关联。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65376473

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档