Matplotlib imshow与EPS

时间:2015-05-18 19:17:43

标签: python svg matplotlib eps

是否可以使用带有matplotlib的PIL来放置EPS或SVG(或任何可缩放矢量格式)的徽标,以便将徽标放在图表上并将最终文件输出为EPS。现在我得到一个非常渲染的图形,因为有一个.png文件试图转换为EPS格式,其目标是将图像保存为.eps.svg

我认为这可能是由于后端的限制,我可以改变我使用的那个。

这是行不通的:

ax1.set_axis_bgcolor('#fafafa')

img = image.imread('./static/images/logo.png')
image_axis = fig.add_axes(ax1.get_position())
image_axis.patch.set_visible(False)
image_axis.yaxis.set_visible(False)
image_axis.xaxis.set_visible(False)
image_axis.set_xlim(0,19.995)
image_axis.set_ylim(0,11.25)

image_axis.imshow(img, extent=(11.79705,18.99525,.238125,1.313625), zorder=-1, alpha=0.15) #need to keep a 5.023 x by y ratio (.4 x .079)

fig.savefig('static/images/graphs/'+filename+'.eps', format='eps', bbox_inches='tight')

有任何更新吗?

3 个答案:

答案 0 :(得分:0)

在这种情况下,我通常会使用以下内容来实现更好的渲染:

from PIL import Image

logo = Image.open('icons\logo.png')
# TODO define bbox as a matplotlib.transforms.Bbox
image_axis.imshow(logo, clip_box=bbox, aspect='equal',
   origin='lower', interpolation='nearest')

(Matplotlib 1.4.2,如果您使用的旧版本使用interpolationorigin选项可能会有所帮助)

答案 1 :(得分:0)

这是一个古老的问题,但是对于希望这样做的现在和将来的访问者来说,都是值得回答的。

有一种加载SVG文件并将其转换为Path对象的方法,该方法在svgpath2mpl包中实现。在项目页面上:

SVG中的路径由“ path”元素定义,该元素包含d="(path data)"属性,该属性包含moveto,line,curve(三次贝塞尔曲线和二次贝塞尔曲线),圆弧和closepath指令。 Matplotlib实际上实际上支持所有这些指令,但不提供解析器或完全兼容的API。

Matplotlib custom marker/symbol见过。

答案 2 :(得分:-1)

我删除了我的代码段,因为它没用。

在Matplotlib中无法使用原生SVG作为图像。 Matplotlib本身仅支持png,然后回退到不支持svg的Pillow,请参阅http://pillow.readthedocs.io/en/latest/handbook/image-file-formats.html或matplotlib图像文档。

枕头支持eps,这样才有用! (我不确定matplotlib会在内部制作什么)

我这样用:

# Pillow must be there
import matplotlib.image as mpimg

def Save_svg(fig):
    # expects a matplotlib figure
    # And puts a logo into a frameless new axes
    imagefile = 'logo.eps'
    svgfile   = 'output.svg'
    logoax    = [0.265, 0.125, 0.3, 0.3]
    img=mpimg.imread(imagefile)
    #
    newax = fig.add_axes(logoax, anchor='SW', zorder=100)
    newax.imshow(img)
    newax.axis('off')
    #
    fig.savefig(svgfile,dpi=300)