2017-12-17 25 views
3

私はipythonノートブックでテキストを含むFigureを作成しています(ここでは、側面にテキストがあるsinカーブです)。私のノートブックでプロットとテキストがインラインで表示されますが、図を保存すると、テキストだけでなくプロットが表示されます。このサンプルコードで問題を再現しました:Python: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"オプションは、保存された範囲をキャンバスのすべての要素を含むように展開または縮小します。このオプションを使用することは、Figureのサイズ、マージン、および座標をまったく気にせずに、プロットの外にある要素を簡単に組み込むのに役立ちます。

最後の注意:テキストの位置をデータ座標で指定しています。これは通常、テキストの位置が軸に表示されるデータに依存するため、望ましくありません。代わりに、それは常に軸に対して位置(1.1,.9)に座っている

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

ように、軸coordiantesでそれを指定するには意味をなさないと思います。

-1

コードの半分が欠落している場合、特にfontsize=12を設定する必要があります。そうしないと、サンプルテキストが表示されません。 linespacing=2.についてjupyterノートブックに示されているその2.0か、単に、マイナータイプ;-)

#!/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は機能している実行可能な最小限のコードで再生して練習できます。 2つの例があります.1つはOP独自のコード例で、現在は動作しています。楽しい! – ZF007

+0

は別に行方不明numpyのインポート(本当に深刻なされていない - 誰もがnumpyのが普通NPとしてインポートされていることを知っている)から、コードは(あなたがコピーしてそれを実行し、それが望ましくない行動を生み出すことができることを意味し完了)完了です。また、この答えが解決しようとすることさえもない、問題に明確な問題があります。また、最初の2つのセンテンスは意味をなさないことに注意してください。問題は、フォントサイズに依存しない、それは問題に行われるように(それは本当に1行のテキストのために重要ではありませんが)linespacingを指定することができます。 – ImportanceOfBeingErnest

関連する問題