【python】matplotlibで背景色と枠線の色を変える
はじめに
matplotlibでは図(figure)の背景色と枠線(エッジ)の色を自由に設定できる。その方法についてメモしておく。
目次
スポンサーリンク
設定方法
plt.figure()の引数に渡してあげる。facecolorおよびedgecolor引数で指定できる。
matplotlib.pyplot.figure — Matplotlib 3.0.2 documentation
なお、枠線のデフォルト幅は0.0にされている。そのため、edgecolorを変更しても一見すると何も起きないように見える。linewidth引数で別途枠線の太さを指定して、はじめて効果を見ることができる。
僕は最初これに気づかなくて、検索して答えにたどり着くまで無駄に色々試行錯誤してしまった。
import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 10, 100) y = np.sin(x) plt.figure(facecolor="azure", edgecolor="coral", linewidth=2) plt.plot(x, y) plt.show()
こんな感じで表示される。
見ての通り、axesの背景色は別に存在しているので、グラフの中だけ白く表示される。
もし色を揃えたければ、axesを取得してこちらにも背景色を設定する。それか、rcParamのaxes.facecolor をいじる(こちらの方法だとすべてのaxesに対して設定が反映されるので注意)。
方法1
import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 10, 100) y = np.sin(x) fig = plt.figure(facecolor="azure", edgecolor="coral", linewidth=2) ax = plt.subplot() ax.plot(x, y) ax.set_facecolor((1,1,1,0)) plt.show()
方法2
import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 10, 100) y = np.sin(x) plt.rcParams["axes.facecolor"] = (1,1,1,0) fig = plt.figure(facecolor="azure", edgecolor="coral", linewidth=2) plt.plot(x, y) plt.show()
今回はどちらの方法でも結果は同じ。
色そのものはalphaが0なら他は何でも良い(透過させるから)。もちろんalphaを0より大きくして任意の色を設定することも可能。
ちなみにaxesにrcParamsでaxes.edgecolorを設定することもできる(することに意味があるかは不明)。set_edgecolor()は存在しないようだ。
plt.savefig()で反映されない
上の画像はスクリーンショットで撮った。
plt.savefig()ではこれらの背景色・枠線の色は反映されない。
import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 10, 100) y = np.sin(x) plt.figure(facecolor="azure", edgecolor="coral", linewidth=2) plt.plot(x, y) plt.savefig("result.png")
理由は、plt.savefig()がfigureの設定を上書きするから(新たなfigureを作るような感じかな)。
参考:python - Matplotlib figure facecolor (background color) - Stack Overflow
plt.savefig()自身がfacecolor, edgecolorなどの引数を取るので、そちらで指定してあげよう。
matplotlib.pyplot.savefig — Matplotlib 3.0.2 documentation
import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 10, 100) y = np.sin(x) plt.figure(linewidth=2) plt.plot(x, y) plt.savefig("result.png", facecolor="azure", edgecolor="coral")
facecolor, edgecolorはこっちで指定すれば良いみたい。linewidthは上のplt.figure()側で指定しないと駄目。ルールがよくわからないが、とにかく動く。
まとめ
やりたいことが単純な割に、注意点が多い気がする。「設定したのに反映されねえ」ってなるシチュエーションが容易に幾つも思い浮かぶ。
ので、自分で設定するよりはseabornとかでスタイルを設定してそれを使った方が実用的かもしれない。
けど、設定する方法を覚えておくと使いたいとき困らないので、知っておいて損はしないと思う。