私は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()
が必要なものになります。
周りを検索すると、plt.savefig()
がファイルを保存する方法のように見えました。 plt.show()
を再度コメントアウトしてplt.savefig()
を実行すると、空白の白い画像が表示されます。 この質問 、これはshow()
の前にsavefig()
を呼び出すことによって引き起こされることを示唆していますが、私はそれを完全にコメントアウトしています。 別の質問ax
オブジェクトを直接保存できることを示唆するコメントがありますが、それは私の凡例を断ち切ります:
同じ質問には、代わりにfig.savefig()
を使用する代替案があります。私は同じ刻んだ伝説を手に入れます。
この質問 がありますが、これは関連しているようですが、DataFrame
を直接プロットしていないため、答えを適用する方法がわかりません(dtf
はpd.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')
行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の回答に関する追加の追加。