2013-07-18 2 views
8

그래서, 해당 래스터 파일 (PNG)보다 더 큰 벡터 파일 (PDF)을 생성하는 파형 (및 다른 것들)을 플로팅하고 있습니다. 플롯 된 데이터 세트가 매우 커서 벡터 파일에 수백만 개의 명령어가 있기 때문에 이것이 상상됩니다. PDF가 더 커지는 것 외에도 PDF 리더가 표시하기가 어렵습니다. 일부에서는로드하는 데 몇 초가 걸립니다. 다른 사람들에게는 전혀로드되지 않습니다.matplotlib 비트 맵 벡터 텍스트

pyplot에서 벡터 축, 레이블 및 기타 모든 텍스트가 포함 된 비트 맵 플롯을 사용할 수 있습니까?

현재 (매우 나쁨) 해결책은 PDF를 생성하고, PNG를 생성하고, inkscape로 PDF를 열고 PNG 파일로 플롯을 바꾸는 것입니다. 분명히 이것은 너무 수동적이고 매우 시간이 오래 걸리므로 계획을 재생성해야한다는 것을 알게됩니다.

+0

이다, 다른 사람이 같은 요청을했다. https://docs.google.com/spreadsheet/ccc?key=0AjrPjlTMRTwTdHpQS25pcTZIRWdqX0pNckNSU01sMHc&usp=sharing – esmit

답변

10

plot 명령에 rasterized=True을 전달하는 것처럼 간단해야합니다.

예. 나를 위해

import matplotlib.pyplot as plt 

plt.plot(range(10), rasterized=True) 
plt.savefig('test.pdf') 

, 이것은 래스터 선이있는 PDF 결과 -와 벡터 텍스트 (해상도가 당신이 savefig로 지정된 dpi의에 의해 제어됩니다 기본적으로는 100입니다).

+0

방금 ​​이후로 사용해 왔지만 정답으로 표시하지 않은 것을 알았습니다. 정확히 내가 찾던 것이고, 나는 문서에서 그것을 어떻게 놓쳤는 지 모른다. 고마워요! – gozzilli

1

이 문제는 더러운 "수정"을 사용합니다. 나는 단순히 음모를 두 번 만들어 낸다. 일단 모든 프레임, 제목 등을 제거하고 png로 저장하고 다른 경우에는 실제 데이터를 제거하고 pdf에서 벡터 데이터로 원하는 모든 구성 요소를 저장합니다. 그런 다음 ImageMagick을 사용하여 png를 비트 맵 데이터가 포함 된 pdf로 변환하고 pdftk를 사용하여 pdf에서 벡터 데이터를 오버레이합니다. 여기에 방금 설명한 matplotlib 페이지의 pcolor 예제가 나와 있습니다.

import matplotlib.pyplot as plt 
import numpy as np 
import os 

for case in ['frame','data']: 

    # make these smaller to increase the resolution                         
    dx, dy = 0.02, 0.02 

    # generate 2 2d grids for the x & y bounds                          
    y, x = np.mgrid[slice(-3, 3 + dy, dy), 
        slice(-3, 3 + dx, dx)] 
    z = (1 - x/2. + x ** 5 + y ** 3) * np.exp(-x ** 2 - y ** 2) 
    # x and y are bounds, so z should be the value *inside* those bounds.                    
    # Therefore, remove the last value from the z array.                        
    z = z[:-1, :-1] 
    z_min, z_max = -np.abs(z).max(), np.abs(z).max() 


    fig=plt.figure() 
    ax=fig.add_subplot(1,1,1) 
    im=plt.pcolor(x, y, z, cmap='RdBu', vmin=z_min, vmax=z_max) 
    plt.title('pcolor') 
    # set the limits of the plot to the limits of the data                       
    plt.axis([x.min(), x.max(), y.min(), y.max()]) 

    if case is 'frame': 
     im.remove() 
     plt.savefig("frame.pdf",transparent=True) 
    if case is 'data': 
     ax.axison=False 
     plt.title('') 
     plt.savefig("data.png",transparent=True) 



os.system('convert data.png data.pdf') 
os.system('pdftk frame.pdf background data.pdf output final_plot.pdf') 
os.system('rm data.png data.pdf frame.pdf') 

은 기본적으로는 최근 (지속적인?)하기 matplotlib 조사의 상세한 설명을 통해 읽기 당신이 이미하고있는 일의 단지이 자동화 버전 ...

+1

좋은 트릭이지만 @Joe Kington의 답변은 쉽고 깨끗합니다. 그 옵션을 시도하는 것이 좋습니다! – gozzilli

+0

참으로 그렇습니다. 일을 더 쉽게 만듭니다. 이 래스터 화 옵션이하는 일에 대해 내가 잘못 생각했다는 것을 알고 있습니다 ... –

관련 문제