matplotlibの棒グラフで、値によって色を変える方法を紹介します。
目次
前提
色をつける方法
棒グラフAxes.barまたはAxes.barh関数で色を指定する方法は、次の2通りがあります。(pyplotでも同じです。)
- color引数にcolorまたはcolorのリストで指定する方法
- 関数の返り値であるpatches.Rectangleインスタンスにset_color()関数で指定する方法
import numpy as np
import matplotlib.pyplot as plt
X = np.arange(10)
Y = np.random.uniform(0, 10, 10)
fig, ax = plt.subplots()
rect = ax.bar(X, Y, color='C1') # プロット時にcolor引数に色を指定
rect[3].set_color('C2') # 後から色を変える
fig.show()
この記事の環境
# Google Colaboratory
import matplotlib
matplotlib.__version__
# '3.2.2'
import numpy
numpy.__version__
# '1.19.5'
Playgrounds
条件で色を変える方法
棒グラフの色を値を条件にして変えるには、プロット時にcolor引数で色を指定するほうが簡単です。
ここでは、そのやり方を使って、条件で色を変える方法を紹介します。
colorのリストを簡単に作る方法
条件が1~2通りの簡単なものなら、colorのリストを [条件 for 変数 in データのリスト] 書法で作成するのが簡単です。
color = [('b' if i < 3 else 'r') for i in Y] # Yの各値iが、i<3のとき'b'、それ以外は'r'
# ['b', 'b', 'b', 'b', 'r', 'r', 'b', 'b', 'r', 'b']
条件を増やすにはelseの部分をネストしていきます。
color = [('b' if i < 3 else ('r' if i < 6 else 'g')) for i in Y] # i<3で'b'、3<=i<6で'r'、それ以外は'g'
このリストをbarプロット時にcolor引数に与えます。
import numpy as np
import matplotlib.pyplot as plt
X = np.arange(10)
Y = np.random.uniform(0, 10, 10)
color = [('b' if i < 3 else ('r' if i < 6 else 'g')) for i in Y]
fig, ax = plt.subplots()
rect = ax.bar(X, Y, color=color)
fig.show()
予めデータを分ける方法
次の方法は、あらかじめデータを分けておいて、色別にプロットを行う方法です。プロットを別々に行うため、色以外のパラメーターも変更したいときには便利な方法です。
numpy.ma.masked_where()関数を使うと、条件外のデータをマスクすることができます。
Y1 = np.ma.masked_where(Y < 5, Y).filled(False) # 除外条件にあうところをFalse値に置換。5未満を除外: 5以上を選択
# array([5.12427514, 6.20905616, 8.74534582, 0. , 0. ,
# 7.66742156, 8.39159773, 0. , 0. , 8.5918611 ])
マスクしたデータをそれぞれの色でプロットすれば、色分けできます。プロット時に色以外のパラメーターも変更することができます。
import numpy as np
import matplotlib.pyplot as plt
X = np.arange(10)
Y = np.random.uniform(0, 10, 10)
Y1 = np.ma.masked_where(Y < 5, Y).filled(False) #5未満を除外: 5以上を選択
Y2 = np.ma.masked_where(Y >= 5, Y).filled(False)
fig, ax = plt.subplots()
ax.bar(X, Y1, width=0.5, color='b') #5以上では、幅を0.5、色を'b'に
ax.bar(X, Y2, color='g')
fig.show()
条件を関数で記述する方法
条件を関数で指定する方法なら、より柔軟性のある条件を指定できます。複雑な条件のときにも、読みやすいコードになります。
- 値valueを受け取って、色値を返す関数colorを定義します。
- 組み込みのmap関数を用いて、color関数をYの各値に対して作用させて、colorのリストを作成します。
def color(value):
return 'C1'
color = list(map(color, Y))
import numpy as np
import matplotlib.pyplot as plt
def color(value):
if value > 7:
return 'C1'
elif value > 4:
return 'C2'
else:
return 'C3'
X = np.arange(10)
Y = np.random.uniform(0, 10, 10)
color = list(map(color, Y))
fig, ax = plt.subplots()
ax.bar(X, Y, color=color)
fig.show()
まとめ
matplotlibの棒グラフで、値によって色を変える方法を紹介しました。
- [関連記事] 棒グラフの様々な描き方 [matplotlib]
- [関連記事] マイナス値のとき棒グラフの色を変える方法 [matplotlib]