2012-11-07 4 views
1

오늘 코스에 대한 리포트를 작성하고 일부 필드의 등고선 그림을 포함해야했습니다. 내가하기 matplotlib (혼란 헤더를 무시)와 이런 짓을 :matplotlib을 사용하여 만든 그림의 크기를 줄입니다.

"Isocurvas.txt"나는 정말 (터치 같은 데이터 또는 무언가를 제거하지 않는 3 열 파일입니다
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() 

, 같으면 나를 위해 일하지 마라.) 내 문제는 그림 크기가 1.8Mb로 나에게 너무 많은 것입니다. 피겨 자체는 전체 보고서의 나머지 부분보다 컸으며 pdf를 열었을 때 매우 원활하지 않았습니다.

그래서, 내 질문은 : 그림의 품질에 희생없이이 크기를 줄일 수있는 방법이

가 있습니까? 내가 어떤 솔루션을 찾고 있어요, 반드시 파이썬 관련이 없습니다.

이것은 .png 그림이며 매개 변수가 약간 다릅니다. .png를 사용하면 픽셀을 볼 수 있습니다. 픽셀은별로 좋아하지 않으므로 pdf 또는 eps가 바람직합니다.

감사합니다.

+0

울퉁불퉁 한 가장자리 (강렬한 파란색과 중간 파란색 사이)는 픽셀 수준의 문제는 아니지만 데이터 또는 메서드 아티팩트로 인한 것일 수 있습니다. –

+0

어떻게 두 번 윤곽을 그리는가? 아마도 벡터 파일 출력에 상당한 오버 헤드가 추가 될 것입니다 (분명히 png 또는 다른 래스터 화 된 형식의 파일 크기에는 아무런 영향이 없습니다) – pelson

+0

데이터 파일 ("Isocurvas.txt")의 크기는 – tacaswell

답변

7

분산 형 플롯은 큰 크기의 원인입니다. EPS 백엔드를 사용하여 데이터를 사용하여 수치를 작성했습니다. 그것의 249KB

특정 예에서 :

  • 를 스트레이트 예에서 : 1.5MB
  • 캐터 플롯없이 : 249KB
  • 래스터 산포도와 함께 여기에 내가 가진 filesizes입니다 왜 산란 (보이지 않음)을 원하는지 불분명 함. 그러나 향후 문제의 경우 plt.scatter 호출시 rasterized=True 키워드를 사용하여 래스터 모드를 활성화 할 수 있습니다. 귀하의 예제에서는 분산 형 플롯에서 12625 포인트를 가지며 벡터 모드에서는 약간의 공간을 차지할 것입니다.

    내가하기 matplotlib에서 벡터 이미지를 트리밍하는 데 사용하는 또 다른 트릭은 다음과 같다 : EPS로

    1. 저장 그림
    2. 결과 파일에 (텍의 분포 가능) 실행 epstopdf

    이것은 일반적으로 matplotlib의 기본값보다 작은 pdf를 제공하며 품질은 변경되지 않습니다. 귀하의 예를 들어, 분산없이 EPS 파일을 사용하여, 그것은 73 Kb와 pdf를 생산, 꽤 합리적인 것 같습니다. 벡터 분산 명령을 실제로 원한다면 원본 1.5 Mb EPS 파일에서 epstopdf를 실행하면 시스템에 198 Kb의 pdf 파일이 생성됩니다.

1

데이터의 산점도를 제거하십시오. 그들은 (당신이 크기 0을 만들었 기 때문에) 최종 그림에서 보이지 않으며 eps에서 공간을 차지할 수 있습니다.

EDITED : 질문을 잘못 읽었 기 때문에 완전히 답을 바꿀 수 있습니다.

+0

이미지가 비트 맵이 아닙니다. 벡터 그래픽이됩니다 (등고선은 다각형 모음입니다). – pelson

+1

@pelson이 너무 피곤한 질문에 대답했다, 이것은 히트 맵이라고 생각했다 .... – tacaswell

2

크기에 도움이되는지 확신 할 수 없지만 matplotlib 1.2 릴리스 후보를 사용해 보려는 경우 PGF 이미지를 생성하기위한 새로운 백엔드가 있습니다 (직접 라텍스 슬롯으로 설계됨). 여기에 대한 문서를 찾을 수 있습니다 : http://matplotlib.org/1.2.0/users/whats_new.html#pgf-tikz-backend

당신이 한 번 쏘기로하고 질문이 있으시면, 나는 아마도 최고의 사람이 아니므로, matplotlib-users mailing을 이메일로 보내시기 바랍니다. 명부.

HTH,

+0

아, 나는 그것을 고맙게 생각할 것이다. – Ariaramnes

관련 문제