Matplotlib-高解像度のグラフをプロットする方法は?


88

いくつかの実験結果をプロットするためにmatplotlibを使用しました(ここで説明します:ファイルをループしてプロットします。ただし、画像を右クリックして画像を保存すると、非常に質の悪い/低解像度の画像になります。

from glob import glob
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl

# loop over all files in the current directory ending with .txt
for fname in glob("./*.txt"):
    # read file, skip header (1 line) and unpack into 3 variables
    WL, ABS, T = np.genfromtxt(fname, skip_header=1, unpack=True)

    # first plot
    plt.plot(WL, T, label='BN', color='blue')

    plt.xlabel('Wavelength (nm)')
    plt.xlim(200,1000)
    plt.ylim(0,100)
    plt.ylabel('Transmittance, %')
    mpl.rcParams.update({'font.size': 14})
    #plt.legend(loc='lower center')
    plt.title('')
    plt.show()
    plt.clf()


    # second plot
    plt.plot(WL, ABS, label='BN', color='red')
    plt.xlabel('Wavelength (nm)')
    plt.xlim(200,1000)
    plt.ylabel('Absorbance, A')
    mpl.rcParams.update({'font.size': 14})
    #plt.legend()
    plt.title('')
    plt.show()
    plt.clf()

私が探しているもののグラフの例:グラフの例

回答:


126

savefig()画像ファイルへのエクスポートに使用できます。

plt.savefig('filename.png')

さらに、次のようなdpiスカラー値への引数を指定できます。

plt.savefig('filename.png', dpi=300)

そのようなファイル名を指定することはできません。スクリプトは、 'fname in glob( "./ *。txt")'のファイルを調べます。
esilik 2016年

ファイルを好きなように呼び出す
Ohad Eytan 2016年

データを上書きし、2つの画像のみを表示します。そうですね。私の目的は、テキストファイルごとに2つのグラフを取得することです。
esilik 2016年

あなたのような何かを行うことができるようにplt.savefig(fname + 'Graph1.png')plt.savefig(fname + 'Graph2.png')
オハッドEytan

すごい!最初のグラフの場合はplt.savefig(fname + 'Graph1a.png'、dpi = 600)、2番目のグラフの場合はplt.savefig(fname + 'Graph1a.png'、dpi = 600)で問題が解決しました。ありがとう!
esilik 2016年

35

plt.figure(dpi=1200)すべての使用の前に使用plt.plot...し、最後に使用する場合plt.savefig(...は 、http//matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.figureおよびhttp://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.savefigを参照して ください。


@deepfriedcyanideは、私の古い質問で次のように言ってくれました。「savefigのファイル名引数は単なる文字列なので、次のようなことができます:plt.savefig( 'folder / file%d.png'%n)カウントアップ各プロットの後。「しかし、私はまだその考えを理解していません。このコードをスクリプトのどこにどのように配置すればよいですか?
esilik 2016年

1
これは私にとってはうまくいきました!現在、私のプロットは4K XDになっています
GonzaloGarcia20年

23

ロスレス品質のためにグラフをsvgとして保存できます。

import matplotlib.pylab as plt

x = range(10)

plt.figure()
plt.plot(x,x)
plt.savefig("graph.svg")

5
plt.savefig("graph.pdf")また、ロスレスのPDFとして保存することもできます
Danny

6

私のようにmatplotlibから高解像度の画像を保存しようとしているときにこの質問を見つけた将来の読者のために、上記および他の場所でいくつかの回答を試し、ここに要約しました。

最良の結果plt.savefig('filename.pdf')

次に、このpdfをコマンドラインでpngに変換して、PowerPointで使用できるようにします。

pdftoppm -png -r 300 filename.pdf filename

または、PDFを開いて、Adobeで必要な画像にトリミングし、pngとして保存して、画像をパワーポイントにインポートするだけです。

あまり成功していないテスト#1plt.savefig('filename.png', dpi=300)

これにより、通常の解像度よりも少し高い解像度で画像が保存されますが、公開や一部のプレゼンテーションには十分な高さではありません。最大2000のdpi値を使用すると、クローズアップで表示したときにぼやけた画像が生成されます。

あまり成功していないテスト#2plt.savefig('filename.pdf')

これは、Googleスライドと同様に、Microsoft Office Professional Plus 2016では開くことができません(したがって、パワーポイントはありません)。

あまり成功していないテスト#3plt.savefig('filename.svg')

上記と同じ問題で、これもパワーポイントやGoogleスライドで開くことはできません。

あまり成功していないテスト#4plt.savefig('filename.pdf')

次に、コマンドラインでpngに変換します。

convert -density 300 filename.pdf filename.png

しかし、これはクローズアップで見るとまだぼやけすぎています。

あまり成功していないテスト#5plt.savefig('filename.pdf')

GIMPで開き、高品質のpngとしてエクスポートします(ファイルサイズが約100KBから約75MBに増加しました)

あまり成功していないテスト#6plt.savefig('filename.pdf')

次に、コマンドラインでjpegに変換します。

pdfimages -j filename.pdf filename

これはエラーを生成しませんでしたが、いくつかのパラメーターを変更した後でもUbuntuで出力を生成しませんでした。


1
.pdf私にとっても最高の品質でした。ほぼ完璧な品質で、4Kのようにズームされています。コマンドラインで変換する代わりに、.pdfのスクリーンショットを撮って、それをpngに保存するだけで十分です。
DavidErickson20年

2

グラフを保存するには:

matplotlib.rcParams['savefig.dpi'] = 300

使用時にグラフを表示する場合plt.show()

matplotlib.rcParams["figure.dpi"] = 100

上部に追加するだけです


0

for()ループの最後で、plt.show()のsavefig()代わりに関数を使用して、Figureの名前、dpi、および形式を設定できます。

たとえば、1000 dpiとeps形式は非常に高品質であり、すべての画像をフォルダ./に「Sample1.eps」、「Sample2.eps」などの名前で保存する場合は、次のコードを追加するだけです。

for fname in glob("./*.txt"):
    # Your previous code goes here
    [...]

    plt.savefig("./{}.eps".format(fname), bbox_inches='tight', format='eps', dpi=1000)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.