2

今天我正在为一门课程做报告,我需要包含某个领域的等高线图。我用 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。

谢谢你。

4

3 回答 3

7

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

  • 直接来自您的示例:1.5Mb
  • 没有散​​点图:249Kb
  • 带有光栅散点图:249Kb

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

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

  1. 将图形另存为 EPS
  2. 在生成的文件上运行epstopdf(可用于 TeX 发行版)

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

于 2012-11-08T03:47:38.280 回答
2

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

如果您决定试一试并且有任何疑问,我可能不是最好的交谈对象,因此建议您向 matplotlib-users 邮件列表发送电子邮件。

高温下,

于 2012-11-07T08:52:24.080 回答
1

尝试删除数据的散点图。它们在您的最终图中似乎不可见(因为您将它们设置为 0 号),并且可能会占用您的 eps 中的空间。

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

于 2012-11-07T06:23:58.527 回答