web-dev-qa-db-ja.com

matplotlibサブプロット図を画像ファイルに保存する

私はmatplotlibにかなり慣れておらず、足を引きずっています。そうは言っても、私はこの質問に対する明白な答えを見つけていません。

グループごとに色分けしたい散布図があり、 ループを介したプロットロールする方法 のように見えました。

上記の最初のリンクに基づいた、私の再現可能な例を次に示します。

import matplotlib.pyplot as plt
import pandas as pd
from pydataset import data

df = data('mtcars').iloc[0:10]
df['car'] = df.index

fig, ax = plt.subplots(1)
plt.figure(figsize=(12, 9))
for ind in df.index:
    ax.scatter(df.loc[ind, 'wt'], df.loc[ind, 'mpg'], label=ind)
ax.legend(bbox_to_anchor=(1.05, 1), loc=2)
# plt.show()
# plt.savefig('file.png')

コメントを外すと、plt.show()が必要なものになります。

good plot

周りを検索すると、plt.savefig()がファイルを保存する方法のように見えました。 plt.show()を再度コメントアウトしてplt.savefig()を実行すると、空白の白い画像が表示されます。 この質問 、これはshow()の前にsavefig()を呼び出すことによって引き起こされることを示唆していますが、私はそれを完全にコメントアウトしています。 別の質問axオブジェクトを直接保存できることを示唆するコメントがありますが、それは私の凡例を断ち切ります:

chopped legend

同じ質問には、代わりにfig.savefig()を使用する代替案があります。私は同じ刻んだ伝説を手に入れます。

この質問 がありますが、これは関連しているようですが、DataFrameを直接プロットしていないため、答えを適用する方法がわかりません(dtfpd.DataFrameです)彼らはプロットしています):

plot = dtf.plot()
fig = plot.get_figure()
fig.savefig("output.png")

提案をありがとう。


編集:以下の提案をテストしてtight_layout()を試してみてください。これを実行しても、空白の白い画像ファイルが表示されます。

fig, ax = plt.subplots(1)
plt.figure(figsize=(12, 9))
for ind in df.index:
    ax.scatter(df.loc[ind, 'wt'], df.loc[ind, 'mpg'], label=ind)
ax.legend(bbox_to_anchor=(1.05, 1), loc=2)
fig.tight_layout()
plt.savefig('test.png')
4
Hendy

plt.figure(figsize=(12, 9))を削除すると、期待どおりに機能します。つまりsavefigの前にshowを呼び出します。

問題は、保存される図がplt.figure()によって作成されたものであり、すべてのデータがその前に作成されたaxにプロットされることです(別の図では、 1つは保存されています)。

凡例を含む図を保存するには、bbox_inches="tight"オプションを使用します

plt.savefig('test.png', bbox_inches="tight")

もちろん、Figureオブジェクトを直接保存することも同様に可能です。

fig.savefig('test.png', bbox_inches="tight")

凡例をプロットから移動する方法の詳細については、 この回答 を参照してください。

bbox_inches='tight''pad_inches=0.1'をより大きな値に設定する必要がある場合、@ ImportanceOfBeingErnestの回答に関する追加の追加。

1
fushan