静かなる名辞

pythonとプログラミングのこと



【python】matplotlibで背景色と枠線の色を変える

はじめに

 matplotlibでは図(figure)の背景色と枠線(エッジ)の色を自由に設定できる。その方法についてメモしておく。

 目次

設定方法

 plt.figure()の引数に渡してあげる。facecolorおよびedgecolor引数で指定できる。

matplotlib.pyplot.figure — Matplotlib 3.0.0 documentation

 なお、枠線のデフォルト幅は0.0にされている。そのため、edgecolorを変更しても一見すると何も起きないように見える。linewidth引数で別途枠線の太さを指定して、はじめて効果を見ることができる。僕は最初これに気づかなくて、検索して答えにたどり着くまで無駄に色々試行錯誤してしまった。

 参考:python - matplotlib can not see the effect of setting edgecolor in plt.savefig() or plt.figure() - Stack Overflow

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()

 こんな感じで表示される。

結果1
結果1

 見ての通り、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()

 今回はどちらの方法でも結果は同じ。

結果2
結果2

 色そのものは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")

result.png
result.png

 理由は、plt.savefig()がfigureの設定を上書きするから(新たなfigureを作るような感じかな)。

 参考:python - Matplotlib figure facecolor (background color) - Stack Overflow

 plt.savefig()自身がfacecolor, edgecolorなどの引数を取るので、そちらで指定してあげよう。

matplotlib.pyplot.savefig — Matplotlib 3.0.0 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()側で指定しないと駄目。ルールがよくわからないが、とにかく動く。

result.png
result.png

まとめ

 やりたいことが単純な割に、注意点が多い気がする。「設定したのに反映されねえ」ってなるシチュエーションが容易に幾つも思い浮かぶ。

 ので、自分で設定するよりはseabornとかでスタイルを設定してそれを使った方が実用的かもしれない。

 けど、設定する方法を覚えておくと使いたいとき困らないので、知っておいて損はしないと思う。