2012-11-07 44 views
1

今天做我正在做一個報告爲一個療程,我需要包括一些領域的等高線圖的身影。我這樣做是與matplotlib(忽略亂頭):減少.EPS圖形的大小使用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。

謝謝。

+0

那些不齊的邊緣(在強烈的藍色和中等藍色之間)似乎不是像素級別的問題,但可能是由於數據或方法瑕疵 –

+0

你怎麼輪廓兩次?這可能會增加向量文件輸出的顯着開銷(顯然它對png或其他柵格化格式的文件大小沒有影響) – pelson

+0

數據文件有多大(「Isocurvas.txt」) – tacaswell

回答

7

散點圖是什麼導致您的大尺寸。使用EPS後端,我使用您的數據來創建數字。下面是我得到了的filesizes:

  • 直接從你的例子:有1.5Mb
  • 沒有散點圖:249KB
  • 與柵格散點圖:249KB

在您的具體的例子是不清楚你爲什麼要分散(不可見)。但是對於將來的問題,您可以在plt.scatter的調用中使用rasterized=True關鍵字來激活光柵模式。在你的例子中,在散點圖中有12625個點,而在向量模式下需要佔用一些空間。

,我使用修剪下來從matplotlib矢量圖像另一個竅門是以下內容:

  1. 保存數字作爲EPS
  2. 運行epstopdf上生成的文件(可帶TeX的分佈)

這通常會給你一個比matplotlib默認的更小的pdf,質量沒有改變。對於你的例子,使用沒有散佈的EPS文件,它產生了73Kb的pdf,這看起來很合理。如果你真的想要一個矢量散佈命令,在原始的1.5 Mb EPS文件上運行epstopdf,在我的系統中生成一個帶有198 Kb的PDF。

1

嘗試刪除數據的散點圖。它們看起來並不在您的最終圖中可見(因爲您將它們設爲0),並且可能佔用了eps中的空間。

編輯:要徹底改變答案,因爲我讀的問題是錯誤的。

+0

圖像不是位圖。這將是一個矢量圖形(輪廓是多邊形的集合)。 – pelson

+1

@pelson回答的問題太累了,以爲這是一張熱圖。 – tacaswell

2

我不知道這是否與大小有所幫助,但如果你願意嘗試matplotlib 1.2候選發佈版是提供一種生產PGF圖像(設計爲直槽成乳膠無縫)一個新的後端。你可以在這裏找到相關的文檔:http://matplotlib.org/1.2.0/users/whats_new.html#pgf-tikz-backend

如果你決定試一試,並且有任何問題,我可能不是最好的交談對象,所以建議給matplotlib用戶發郵件名單。

HTH,

+0

哦,我會查它的,謝謝。 – Ariaramnes