棒グラフの色を条件によって変える3つの方法 [matplotlib]

matplotlibの棒グラフで、値によって色を変える方法を紹介します。

前提

色をつける方法

棒グラフAxes.barまたはAxes.barh関数で色を指定する方法は、次の2通りがあります。(pyplotでも同じです。)

  1. color引数にcolorまたはcolorのリストで指定する方法
  2. 関数の返り値である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()

条件を関数で記述する方法

条件を関数で指定する方法なら、より柔軟性のある条件を指定できます。複雑な条件のときにも、読みやすいコードになります。

  1. 値valueを受け取って、色値を返す関数colorを定義します。
  2. 組み込みの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の棒グラフで、値によって色を変える方法を紹介しました。

参考