减少使用matplotlib制作的.eps数字的大小

时间:2012-11-07 04:26:38

标签: python matplotlib size contour

今天我正在做一个课程的报告,我需要包括一个字段的等高线图。我用matplotlib做了这个(忽略混乱的标题):

import numpy as np
import matplotlib
from matplotlib import rc
rc('font',**{'family':'sans-serif','sans-serif':['Helvetica']})
## for Palatino and other serif fonts use:
#rc('font',**{'family':'serif','serif':['Palatino']})
rc('text', usetex=True)
from matplotlib.mlab import griddata
import matplotlib.pyplot as plt
import numpy.ma as ma
from numpy.random import uniform
from matplotlib.colors import LogNorm
fig = plt.figure()
data = np.genfromtxt('Isocurvas.txt')
matplotlib.rcParams['xtick.direction'] = 'out'
matplotlib.rcParams['ytick.direction'] = 'out'
rc('text', usetex=True)
rc('font', family='serif')
x = data[:,0]
y = data[:,1]
z = data[:,2]
# define grid.
xi = np.linspace(0.02,1, 100)
yi = np.linspace(0.02,1.3, 100)
# grid the data.
zi = griddata(x,y,z,xi,yi)
# contour the gridded data.
CS = plt.contour(xi,yi,zi,25,linewidths=0,colors='k')
CS = plt.contourf(xi,yi,zi,25,cmap=plt.cm.jet)
plt.colorbar() # draw colorbar
# plot data points.
plt.scatter(x,y,marker='o',c='b',s=0)
plt.xlim(0.01,1)
plt.ylim(0.01,1.3)
plt.ylabel(r'$t$')
plt.xlabel(r'$x$')
plt.title(r' Contour de $\rho(x,t)$')
plt.savefig("Isocurvas.eps", format="eps")
plt.show()

其中“Isocurvas.txt”是一个3列文件,我真的不想触摸(消除数据或类似的东西,对我来说不起作用)。我的问题是数字大小为1.8 Mb,这对我来说太过分了。这个数字本身比报告的其余部分都要大,当我打开pdf时它不是很顺利。

所以,我的问题是:

有没有办法在不牺牲图形质量的情况下缩小尺寸?我正在寻找任何解决方案,不一定与python相关。

这是.png数字,参数略有不同。使用.png你可以看到我不太喜欢的像素,所以最好是pdf或eps。

谢谢。

3 个答案:

答案 0 :(得分:7)

散点图是造成你的大尺寸的原因。使用EPS后端,我使用您的数据来创建数字。这是我得到的文件大小:

  • 直接从你的例子:1.5Mb
  • 没有散点图:249Kb
  • 使用栅格散点图:249Kb

在您的特定示例中,您不清楚为什么要分散(不可见)。但是对于将来出现的问题,您可以在调用rasterized=True时使用plt.scatter关键字来激活栅格模式。在您的示例中,散点图中有12625个点,而在矢量模式下,这将占用一些空间。

我用来修剪matplotlib矢量图像的另一个技巧如下:

  1. 将数字另存为EPS
  2. 在生成的文件
  3. 上运行epstopdf(可与TeX发行版一起使用)

    这通常会给你一个比matplotlib默认值更小的pdf,质量不变。对于您的示例,使用没有散点的EPS文件,它生成了一个73 Kb的pdf,这似乎很合理。如果你真的想要一个矢量分散命令,在原始的1.5 Mb EPS文件上运行epstopdf会在我的系统中产生一个198 Kb的pdf。

答案 1 :(得分:2)

我不确定它是否对尺寸有帮助,但如果您愿意尝试使用matplotlib 1.2版本候选版本,则会有一个新的后端用于生成PGF图像(旨在无缝地直接插入乳胶)。您可以在此处找到相关文档:http://matplotlib.org/1.2.0/users/whats_new.html#pgf-tikz-backend

如果您决定尝试一下并且有任何疑问,我可能不是最适合交谈的人,因此建议通过电子邮件发送matplotlib-users邮件列表。

HTH,

答案 2 :(得分:1)

尝试删除数据的散点图。它们似乎在你的最终数字中看不到(因为你把它们的大小设为0)并且可能占用你的eps中的空间。

编辑:完全改变答案,因为我读错了这个问题。