2017-12-17 1 views
3

ipython 노트북에서 일부 텍스트 (예 : 옆에 텍스트가있는 사인 곡선)가있는 그림을 만듭니다. 음모와 텍스트가 내 노트에 인라인으로 표시되지만 그림을 저장할 때 텍스트가 아니라 그림 만 보입니다. 나는이 예제 코드의 문제를 재현했습니다파이썬 : ax.text가 저장된 PDF에 표시되지 않습니다

import numpy as np 
import matplotlib.pyplot as plt 

fig,ax = plt.subplots(1) 
x = np.linspace(0, 2*np.pi, 100) 
y = np.sin(x) 
ax.plot(x, y) 
ax.text(8,0.9,'Some Text Here',multialignment='left', linespacing=2.) 
plt.savefig('sin.pdf') 
내가 저장 한 PDF에서 텍스트를 볼 수있는 방법

?

+0

텍스트 좌표 (8,0.9)가 그래프의 표시된 범위 내에 있지 않습니다. –

답변

1

그림은 PNG 이미지를 저장됩니다. 그들은 bbox_inches="tight" 옵션으로 저장됩니다.

노트북의 png와 완전히 똑같은 pdf를 생성하려면이 옵션을 사용해야합니다.

plt.savefig('sin.pdf', bbox_inches="tight") 

그 이유는 좌표 (8,0.9)가 그림 외부에 있기 때문입니다. 따라서 텍스트는 저장된 버전에 표시되지 않습니다 (대화식 그림에도 표시되지 않음). bbox_inches="tight" 옵션은 캔버스의 모든 요소를 ​​포함하도록 저장된 범위를 확장하거나 축소합니다. 이 옵션을 사용하면 실제로 그림 크기, 여백 및 좌표에 신경 쓰지 않고도 플롯 외부에있는 요소를 쉽게 포함 할 수 있습니다.

마지막주의 사항 : 데이터 좌표에서 텍스트의 위치를 ​​지정하고 있습니다. 이것은 일반적으로 바람직하지 않습니다. 텍스트의 위치가 축에 표시되는 데이터에 따라 달라지기 때문입니다. 대신 그것은 항상 축에 대한 위치 (1.1,.9)에 앉아

ax.text(1.1, .9, 'Some Text Here', va="top", transform=ax.transAxes) 

있도록, 축 coordiantes에를 지정하는 의미가있다.

-1

코드의 절반을 놓치고 특히 fontsize=12을 설정해야합니다. 그렇지 않으면 예제 텍스트가 표시되지 않습니다. linespacing=2.에 대한 2.0하거나 2는 jupyter 노트북에 표시된 작은 유형 ;-)

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import numpy as np 

import matplotlib.pyplot as plt 
from matplotlib.font_manager import FontProperties 
from matplotlib.backends.backend_pdf import PdfPages 

with PdfPages('filename3.pdf') as pdf: 
    plt.figure(figsize=(3, 3)) 
    plt.plot(range(7), [3, 1, 4, 1, 5, 9, 2], 'r-o') 
    #t = np.arange(0.0, 2.0, 0.01) 
    #s = 1 + np.sin(2 * np.pi * t) 
    #plt.plot(t, s) 
    plt.title('Page One') 
    plt.savefig(pdf, format = 'pdf') # saves the current figure into a pdf page 
    plt.close() 

    plt.rc('text', usetex=False) 
    plt.figure(figsize=(8, 6)) 
    x = np.arange(0, 5, 0.1) 
    plt.plot(x, np.sin(x), 'b-') 
    t = np.arange(0.0, 2.0, 0.01) 
    s = 1 + np.sin(2 * np.pi * t) 
    fig, ax = plt.subplots() 
    ax.plot(t, s) 

    ax.text(0.5, 0.5, 'Some Text Here', linespacing=2, fontsize=12, multialignment='left') 

    ax.set(xlabel='time (s)', ylabel='voltage (mV)', 
    title='About as simple as it gets, folks') 

    ax.grid() 

    #plt.title('Page Two') 
    pdf.attach_note("plot of sin(x)", positionRect=[-100, -100, 0, 0]) # you can add a pdf note to 
            # attach metadata to a page 
    plt.savefig(pdf, format = 'pdf') 
    plt.close() 
+0

정말로 이것이 질문에 대답하는지 확실하지 않습니다. 그러나 최소한 그것은 그것이 필요로하는 것보다 훨씬 더 복잡하게 만들고 완전히 무의미한 것들을 포함합니다. 질문에 대답 할 때 질문에 주어진 [mcve]를 사용하고 질문의 문제를 해결하는 방법으로 변경하십시오. – ImportanceOfBeingErnest

+0

@ ImportanceOfBeingErnest ... OP 코드가 불완전했습니다. 이제 OP는 작동 가능한 최소의 코드로 놀고 놀 수 있습니다. 여기에는 두 가지 예가 있습니다. 하나는 OP 자신의 코드 예제이고, 다른 하나는 부분과 그 이유를 보여주는 예제의 일부분을 사용합니다. 즐겨! – ZF007

+0

누락 된 numpy 가져 오기 (실제로는 심각하지 않습니다. numpy는 대개 np로 가져온다는 것을 모두 알고 있습니다)는 코드가 완전합니다 (완전한 복사와 실행으로 원하지 않는 동작을 생성 할 수 있음을 의미합니다). 또한이 질문에 답이 해결되지 않는 명확한 문제가 있습니다. 또한 처음 두 문장은 의미가 없습니다. 문제는 글꼴 크기에 독립적이며 문제에서 수행 된대로 줄 간격을 지정할 수 있습니다 (한 줄 텍스트에 대해서는 중요하지 않지만). – ImportanceOfBeingErnest

관련 문제