Matplotlibの使い方②(plt.bar、plt.pie、plt.hist2d)|Pythonによる可視化入門 #2

f:id:lib-arts:20190611223958p:plain

Pythonを使うにあたって使いこなせると便利なのがMatplotlibをはじめとする可視化用のライブラリです。とはいえ、ドキュメントを読むとなると必要な機能をピンポイントで探すのが大変なので、入門者向けに軽い導入はあると良さそうです。
当シリーズではそれを受けてPythonを用いたデータの可視化についてよく使う機能を中心にまとめていきます。
#1ではmatplotlib.pyplotより、plt.plot、plt.scatter、plt.histについてまとめました。

#2では下記の"Sample plots in Matplotlib"が機能を知るには良さそうだったのでこちらより機能をいくつかご紹介できればと思います。

Sample plots in Matplotlib — Matplotlib 3.1.0 documentation
以下目次になります。
1. 基本的なグラフの描画機能(plt.bar、plt.pie、plt.hist2d)
1-1. plt.barを用いた棒グラフの描画
1-2. plt.pieを用いた円グラフの描画
1-3. plt.hist2dを用いた2次元データのヒストグラムの描画
2. まとめ

 

1. 基本的なグラフの描画機能(plt.bar、plt.pie、plt.hist2d)
#1に引きつづぎ基本的なグラフの描画機能ということで、plt.bar(棒グラフ)、plt.pie(円グラフ)、plt.hist2d(2次元のヒストグラム)の三つについて取り扱っていきます。

 

1-1. plt.barを用いた棒グラフの描画
まずは棒グラフを描画する機能である、plt.barについて取り扱います。例のごとく、サンプルが先の方がわかりやすいと思うので、まずは下記のコードを動かしてみましょう。

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(0)
x = np.arange(1,10,1)
y = 2*x + np.random.rand(9)

print(y)
plt.bar(x, y)
plt.show()

実行結果としては下記のようになります。

f:id:lib-arts:20190612165610p:plain
通常の棒グラフが描けているのが確認できるかと思います。比較対象がある方が良いので、下記では二次関数をベースにyの値を設定し同じく可視化を行ってみました。

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(0)
x = np.arange(1,10,1)
y = 2*(x-5)**2 + 1 + np.random.rand(9)

print(y)
plt.bar(x, y)
plt.show()

実行結果は下記のようになります。

f:id:lib-arts:20190612165642p:plain
綺麗に可視化ができており、値を視覚的に掴みやすいようになっています。

 

1-2. plt.pieを用いた円グラフの描画
次に円グラフを描画する機能である、plt.pieについて取り扱います。まずは下記のサンプルコードを動かしてみましょう。

import numpy as np
import matplotlib.pyplot as plt

labels = ["Chiba", "Yokohama", "Tokyo", "Saitama"]
sizes = np.array([20, 30, 40, 10])

plt.pie(sizes, labels=labels)
plt.show()

実行結果は下記のようになります。

f:id:lib-arts:20190612170943p:plain
データ、ラベル共に適当に生成しましたが、当たり障りのない内容ということで地名を入れておきました。イベント参加者のアンケートを取った際の居住地の集計とでも捉えていただけたらと思います。少々グラフが味気ないので、オプションを用いて少しカスタマイズしてみましょう。

import numpy as np
import matplotlib.pyplot as plt

labels = ["Chiba", "Yokohama", "Tokyo", "Saitama"]
sizes = np.array([20, 30, 40, 10])
explode = np.array([0.1, 0, 0, 0])

plt.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%', shadow=True, startangle=90, counterclock=False)
plt.show() 

上記の実行結果は下記のようになります。

f:id:lib-arts:20190612172618p:plain
それぞれのオプションの意味合いとしては、explodeが強調する要素、autopctは%をつけるか、shadowは影をつけるか、startangleは円グラフのスタート位置、counterclockは円グラフの回転の向きをそれぞれ表しています。特にcounterclockはデフォルトが反時計回りのため、注意が必要です。

 

1-3. plt.hist2dを用いた2次元データのヒストグラムの描画
1-3では2次元データのヒストグラムを描画するplt.hist2dに関して取り扱います。1次元データのヒストグラムについては高さで表現していましたが、2次元データのヒストグラムに関しては色で表現します。こちらも早速サンプルコードを動かしてみましょう。

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(0)
x = np.random.rand(1000)
y = np.random.rand(1000)

plt.hist2d(x, y)
plt.show()

上記の実行結果は下記になります。

f:id:lib-arts:20190612174110p:plain
黒いところがサンプルが少なく、黄色のところがサンプルが多くなっています。一様分布を元にヒストグラムを書いているため、特に捉えようのないヒストグラムになっています。比較として、正規分布にしたがって値を生成を行ったものを可視化してみましょう。

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm

np.random.seed(0)
x = norm.rvs(size=1000)
y = norm.rvs(size=1000)

plt.hist2d(x, y)
plt.show()

上記の実行結果は下記のようになります。

f:id:lib-arts:20190612174144p:plain
こちらも黒いところがサンプルが少なく、黄色のところがサンプルが多くなっています。x、y共に0を中心に分布していることがわかります。もう少し詳細に確認できればということで、サンプルサイズと区間の数を増やして実行してみましょう。

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm

np.random.seed(0)
x = norm.rvs(size=100000)
y = norm.rvs(size=100000)

plt.hist2d(x, y, bins=30)
plt.show() 

f:id:lib-arts:20190612174221p:plain
上記を確認することで、正規分布のイメージがよりつかめるかと思います。このようにplt.hist2dを用いることで、2次元データのヒストグラムを描くことが可能となります。


2. まとめ
#2では#1と同様に基本的な描画機能として、plt.bar、plt.pie、plt.hist2dについて取り扱いました。
#3でも今回同様"Sample plots in Matplotlib"より、いくつか機能をご紹介できればと思います。