65

matplotlibでpylabを使用してプロットを作成し、そのプロットを画像ファイルに保存しています。ただし、を使用して画像を保存すると、保存されたSIZE画像は、を使用したときに表示される画像と同じであるpylab.savefig( image_name )ことがわかります。pylab.show()

たまたま、プロットにはたくさんのデータがあり、を使用しているときはpylab.show()、すべてのプロットを正しく表示する前にウィンドウを最大化する必要があり、xlabelティッカーは互いに重なりません。

画像をファイルに保存する前に、プログラムでウィンドウを「最大化」できる方法はありますか?-現時点では、「デフォルト」のウィンドウサイズの画像しか取得していないため、x軸のラベルが互いに重なり合っています。

4

8 に答える 8

59

matplotlib(pylab)には、画像サイズを制御するための2つの主要なオプションがあります。

  1. 結果の画像のサイズをインチ単位で設定できます
  2. 出力ファイルのDPI(1インチあたりのドット数)を定義できます(基本的には解像度です)

通常は両方を実行します。これにより、結果の画像サイズをピクセル単位で完全に制御できるようになります。たとえば、正確に800x600の画像をレンダリングする場合は、DPI = 100を使用して、サイズをインチで8x6に設定できます。

import matplotlib.pyplot as plt
# plot whatever you need...
# now, before saving to file:
figure = plt.gcf() # get current figure
figure.set_size_inches(8, 6)
# when saving, specify the DPI
plt.savefig("myplot.png", dpi = 100)

任意のDPIを使用できます。実際、さまざまなDPIとサイズの値を試して、最も気に入った結果を得ることができます。ただし、matplotlibは凡例やその他のテキストをレンダリングするのに適したフォントを見つけられない可能性があるため、非常に小さいDPIを使用することはお勧めできません。たとえば、1ピクセルでレンダリングされた文字を含むフォントがないため、DPI=1を設定することはできません:)

他のコメントから、あなたが抱えている他の問題は適切なテキストレンダリングであることがわかりました。このため、フォントサイズを変更することもできます。たとえば、デフォルトで使用される1文字あたり12ピクセルではなく、1文字あたり6ピクセルを使用できます(事実上、すべてのテキストが2倍小さくなります)。

import matplotlib
#...
matplotlib.rc('font', size=6)

最後に、元のドキュメントへの参照:http: //matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.savefig、http : //matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot .gcfhttp: //matplotlib.sourceforge.net/api/figure_api.html#matplotlib.figure.Figure.set_size_inches、http : //matplotlib.sourceforge.net/users/customizing.html#dynamic-rc-settings

PS申し訳ありませんが、私はpylabを使用しませんでしたが、私が知る限り、上記のすべてのコードはpylabでも同じように機能しpltます。コードをpylab(またはpylabのインポート時に割り当てた名前)に置き換えるだけです。同じmatplotlib-pylab代わりに使用します。

于 2012-04-21T19:16:04.223 に答える
32

初期化時にサイズを設定します。

fig2 = matplotlib.pyplot.figure(figsize=(8.0, 5.0)) # in inches!

編集

問題がx軸の目盛りにある場合-「手動で」設定できます。

fig2.add_subplot(111).set_xticks(arange(1,3,0.5)) # You can actually compute the interval You need - and substitute here

そして、あなたのプロットの他の側面についても同様です。すべてを構成できます。次に例を示します。

from numpy import arange
import matplotlib
# import matplotlib as mpl
import matplotlib.pyplot
# import matplotlib.pyplot as plt

x1 = [1,2,3]
y1 = [4,5,6]
x2 = [1,2,3]
y2 = [5,5,5]

# initialization
fig2 = matplotlib.pyplot.figure(figsize=(8.0, 5.0)) # The size of the figure is specified as (width, height) in inches

# lines:
l1 = fig2.add_subplot(111).plot(x1,y1, label=r"Text $formula$", "r-", lw=2)
l2 = fig2.add_subplot(111).plot(x2,y2, label=r"$legend2$" ,"g--", lw=3)
fig2.add_subplot(111).legend((l1,l2), loc=0)

# axes:
fig2.add_subplot(111).grid(True)
fig2.add_subplot(111).set_xticks(arange(1,3,0.5))
fig2.add_subplot(111).axis(xmin=3, xmax=6) # there're also ymin, ymax
fig2.add_subplot(111).axis([0,4,3,6]) # all!
fig2.add_subplot(111).set_xlim([0,4])
fig2.add_subplot(111).set_ylim([3,6])

# labels:
fig2.add_subplot(111).set_xlabel(r"x $2^2$", fontsize=15, color = "r")
fig2.add_subplot(111).set_ylabel(r"y $2^2$")
fig2.add_subplot(111).set_title(r"title $6^4$")
fig2.add_subplot(111).text(2, 5.5, r"an equation: $E=mc^2$", fontsize=15, color = "y")
fig2.add_subplot(111).text(3, 2, unicode('f\374r', 'latin-1'))

# saving:
fig2.savefig("fig2.png")

だから-あなたは正確に何を構成したいですか?

于 2012-04-06T09:36:52.600 に答える
11

図をファイルに保存するときは、別の解像度を指定する必要があると思います。

fig = matplotlib.pyplot.figure()
# generate your plot
fig.savefig("myfig.png",dpi=600)

大きなdpi値を指定すると、GUIウィンドウを最大化するのと同様の効果があります。

于 2012-04-18T17:04:15.717 に答える
4

これを確認してください: Pythonを使用してplt.show()ウィンドウを最大化する方法

コマンドは、使用するバックエンドによって異なります。これが、保存された画像が画面に表示されているものと同じスケーリングになるようにするための最良の方法であることがわかりました。

QTバックエンドでCanopyを使用しているので:

pylab.get_current_fig_manager().window.showMaximized()

次に、必要に応じてsavefig()を呼び出し、シルバドの回答ごとにDPIを増やします。

于 2013-09-26T00:11:20.857 に答える
3

保存された図を1920x983ピクセル(最大化されたウィンドウを保存したときのサイズ)のようなサイズで見ることができます。次に、dpiを100に、サイズを19.20x9.83に設定すると、正常に機能しました。最大化された数値とまったく同じように保存されます。

import numpy as np
import matplotlib.pyplot as plt
x, y = np.genfromtxt('fname.dat', usecols=(0,1), unpack=True)
a = plt.figure(figsize=(19.20,9.83))
a = plt.plot(x, y, '-')
plt.savefig('file.png',format='png',dpi=100)
于 2019-12-22T00:07:50.950 に答える
3

私はこの正確な問題を抱えていました、そしてこれはうまくいきました:

plt.savefig(output_dir + '/xyz.png', bbox_inches='tight')

ドキュメントは次のとおりです。

[ https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.savefig.html] [1]

于 2020-02-12T16:25:47.857 に答える
1

私は以前に同じ検索を行いましたが、彼の正確な解決策はバックエンドに依存しているようです。

私はたくさんのソースを読みましたが、おそらく最も有用なのはここでのPythonioによる回答でした。Pythonを使用してplt.show()ウィンドウを最大化する方法 コードを調整して、以下の関数になりました。これは、Windowsで適切に機能します。私は主に、Qtを使用します。ここでは、他のバックエンドで最小限のテストを行っていますが、Qtを頻繁に使用しています。

基本的には、バックエンドを識別し、適切な関数を呼び出すことで構成されます。一部のウィンドウが最大化され、他のウィンドウが最大化されないという問題が発生したため、後で一時停止を追加したことに注意してください。これで解決したようです。

def maximize(backend=None,fullscreen=False):
    """Maximize window independently on backend.
    Fullscreen sets fullscreen mode, that is same as maximized, but it doesn't have title bar (press key F to toggle full screen mode)."""
    if backend is None:
        backend=matplotlib.get_backend()
    mng = plt.get_current_fig_manager()

    if fullscreen:
        mng.full_screen_toggle()
    else:
        if backend == 'wxAgg':
            mng.frame.Maximize(True)
        elif backend == 'Qt4Agg' or backend == 'Qt5Agg':
            mng.window.showMaximized()
        elif backend == 'TkAgg':
            mng.window.state('zoomed') #works fine on Windows!
        else:
            print ("Unrecognized backend: ",backend) #not tested on different backends (only Qt)
    plt.show()

    plt.pause(0.1) #this is needed to make sure following processing gets applied (e.g. tight_layout)
于 2018-09-14T02:54:51.290 に答える
-1

私があなたのやりたいことを正しく理解していれば、あなたはあなたのフィギュアを作成し、ウィンドウのサイズを設定することができます。その後、matplotlibツールボックスボタンを使用してグラフを保存できます。ここに例があります:

from pylab import get_current_fig_manager,show,plt,imshow

plt.Figure()
thismanager = get_current_fig_manager()
thismanager.window.wm_geometry("500x500+0+0") 
#in this case 500 is the size (in pixel) of the figure window. In your case you want to maximise to the size of your screen or whatever

imshow(your_data)
show()
于 2012-04-18T16:46:00.370 に答える