Skip to main content
 首页 » 编程设计

python之减小使用 matplotlib 制作的 .eps 图的大小

2025年05月04日10lyhabc

今天我正在为一门类(class)做报告,我需要包括一些领域的等高线图。我用 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。

谢谢。

请您参考如下方法:

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

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

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

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

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

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