matplotlibのpyplotで分割線入りのヒストグラムを描写する


このエントリーをはてなブックマークに追加

pythonを使ってmatplotlibのpyplotでヒストグラムを描写する時に

分割線(separated lines)がなくてちょっと見づらいので分割線を与えてあげる

環境は

  • Python 3.6.0
  • Jupyter-notebook

デフォルトだと分割線がなくて見づらい

例えば下記コードでヒストグラムを表示させた際、分割線が出てこなくて見づらくなる

1
2
3
4
5
% matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
plt.hist(np.random.randn(100))

jupyter-notebookを使わないpythonコードの場合はshowしてやる必要がある

1
2
3
4
5
import numpy as np
import matplotlib.pyplot as plt
plt.hist(np.random.randn(100))
plt.show()


ので、これに分割線を入れてやる

オプションで ec=’black’ を指定してやる

下記を参考にした

python - Cannot get histogram to show separated bins with vertical lines - Stack Overflow

下記コードのように、pyplotのhist関数に ec='black' を加えてやればよい

1
2
3
4
5
% matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
plt.hist(np.random.randn(100), ec='black')

jupyter-notebookではない場合は下記

1
2
3
4
5
import numpy as np
import matplotlib.pyplot as plt
plt.hist(np.random.randn(100), ec='black')
plt.show()

  • もちろん、ec='red' など別の色でも指定できるので色々と試してみると良い
  • ecは edgecolor の略のよう

色々matplotlibについて書かれた記事みてると、分割線が勝手に描写されてるのでこれ最近の変更なのかな・・・?


ちなみにヒストグラムを複数重ねる時は histtype = ‘step’ が見やすくなる

csvファイルは下記リンク先のを使用した

https://raw.github.com/pydata/pandas/master/pandas/tests/data/iris.csv

よくある例でアヤメの分類をヒストグラムで同じグラフに重ねた時

重なった部分が見にくくなってしまう

1
2
3
4
5
6
7
8
9
10
11
12
13
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
iris = pd.read_csv("iris.csv")
setosa = iris[iris["Name"] == "Iris-setosa"]
versicolor = iris[iris["Name"] == "Iris-versicolor"]
virginica = iris[iris["Name"] == "Iris-virginica"]
plt.hist(setosa["SepalLength"], color='red')
plt.hist(versicolor["SepalLength"], color='blue')
plt.hist(virginica["SepalLength"], color='green')
plt.show()


これを下記のように、hist関数のオプションに histtype='step' を適用するとbarのエッジ部分だけになって多少見やすくなる

といっても完全に見やすいわけではないので、やっぱりこの例のグラフだと別々に描写したほうが見やすいのではとも思う

1
2
3
4
5
6
7
8
9
10
11
12
13
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
iris = pd.read_csv("iris.csv")
setosa = iris[iris["Name"] == "Iris-setosa"]
versicolor = iris[iris["Name"] == "Iris-versicolor"]
virginica = iris[iris["Name"] == "Iris-virginica"]
plt.hist(setosa["SepalLength"], color='red', histtype='step')
plt.hist(versicolor["SepalLength"], color='blue', histtype='step')
plt.hist(virginica["SepalLength"], color='green', histtype='step')
plt.show()


このエントリーをはてなブックマークに追加