Pythonのグラフ作成における定番ライブラリmatplotlibを用いて、棒グラフやヒストグラム、散布図などよく使うグラフの作成方法を紹介していきます。
- タイトルや凡例を追加する方法については、こちらの記事を参照ください。
- 複数のグラフを並べて表示する方法は、こちらの記事を参照ください。
- グラフの色を調整する方法は、こちらの記事を参照ください。
matplotlibを用いたグラフ作成
はじめに今回使用するライブラリをimportします。
import numpy as np
import matplotlib.pyplot as plt
それでは順番にグラフの作成方法を紹介します。
折れ線・曲線グラフ
折れ線グラフは推移を比較できるので、金融チャートなどの時系列データを確認する際に便利です。
横軸の指定を省略すると、縦軸のIndexが代わりに用いられます。
# データ
xx = np.array([3,4,2,4,2,5,1,3])
# グラフ表示
fig, ax = plt.subplots()
ax.plot(xx, label='x')
# オプション:グラフタイトル、縦/横軸名称、凡例の追加
ax.set_title('折れ線グラフ', fontsize=16, fontname="AppleGothic") # タイトル。fontnameは日本語フォント用に指定
ax.set_xlabel('Index', fontsize=16) # 横軸の名称
ax.set_ylabel('x', fontsize=16) # 縦軸の名称
ax.legend() # 凡例
plt.show()
データのサンプル数を細かくするとより滑らかな曲線になります。
# データ
tt = np.linspace(0,1,100)*2*np.pi
xx = np.sin(tt)
# グラフ表示
fig, ax = plt.subplots()
ax.plot(tt, xx, label='sin波')
# オプション:グラフタイトル、縦/横軸名称、横軸線、凡例の追加
ax.set_title('折れ線グラフ', fontsize=16, fontname="AppleGothic")
ax.set_xlabel('Time', fontsize=16)
ax.set_ylabel('x', fontsize=16)
ax.legend(prop={"family":"AppleGothic"}) # 凡例。propは日本語フォント用に追加
plt.show()
余談:グラフを画像として保存
作成したグラフを画像として保存したい場合はplt.savefig関数を用います。
例えば、先の折れ線グラフを保存したい場合はplt.show()の代わりに、以下のコマンドを実行すれば指定の場所に保存されます。
# PNG形式でグラフを保存する方法
plt.savefig('ファイル名.png')
棒グラフ
棒グラフはデータの大きさを単純に並べて比較する際に便利です。
# データ
data = [20, 35, 30, 35, -27]
index = range(len(data))
width = 0.8
# グラフ表示
fig, ax = plt.subplots()
ax.bar(index, data, width, label='Men')
# オプション:グラフタイトル、縦軸名称、横軸線、凡例の追加
ax.set_title('Bar graph')
ax.set_ylabel('Scores')
ax.axhline(0, color='grey', linewidth=0.8)
ax.legend()
plt.show()
棒グラフではaxes.barのwidthを指定することで、棒の太さを変更できます。
またax.barhを用いると横に伸びる棒グラフを作成できます。
# データ
data = [20, 35, 30, 35, 27]
index = range(len(data))
height = 0.8
# グラフ表示
fig, ax = plt.subplots()
ax.barh(index, data, height, align='center',label='Scores')
ax.invert_yaxis() # Y軸を昇順に表示する
# オプション:グラフタイトル、縦/横軸名称、凡例の追加
ax.set_title('Bar graph (horizontal)')
ax.set_xlabel('Scores')
ax.set_ylabel('Index')
ax.legend()
plt.show()
棒グラフの配置位置と太さを調整することで、複数データを並べたグループ棒グラフを作成できます。
# データ
dataA = [20, 34, 30, 35, 27]
dataB = [25, 32, 34, 20, 25]
x_loc = np.arange(len(dataA))
index = ['#1', '#2','#3','#4','#5']
width = 0.35 # 棒グラフの太さを調整
# グラフ表示
fig, ax = plt.subplots()
r1 = ax.bar(x_loc - width/2, dataA,width,label='Group A') # 棒グラフの配置(x_loc - width/2)を指定
r2 = ax.bar(x_loc + width/2, dataB,width,label='Group B') # 棒グラフの配置(x_loc + width/2)を指定
# オプション:タイトル、縦軸の名称、横軸のラベル、凡例を追加
ax.set_title('Grouped Bar chart') # タイトル
ax.set_ylabel('Numbers') # 縦軸の名称
ax.set_xticks(x_loc) # 横軸のラベル
ax.set_xticklabels(index) # 横軸のラベル
ax.legend()
plt.show()
また、ax.barのbottomにdataAを指定することで、積み上げ棒グラフにもできます。
r1 = ax.bar(x_loc, dataA,width,label='Group A')
r2 = ax.bar(x_loc, dataB, width, bottom=dataA, label='Group B')# bottomにdataAを指定
円グラフ
円グラフは、ある量に占める各要素の割合を視覚的に確認するのに便利です。
以下の例では各プログラム言語の利用割合が一目で分かります。
# データ
labels = ['C','Java','Python','C++','C#','Visual Basic','JavaScript','Others']
data = [16.34,11.29,10.86,6.88,4.44,4.33,2.27,43.59]
# グラフ表示
fig, ax = plt.subplots(figsize=(8,8))
ax.pie(data, labels=labels, counterclock=False, startangle=90,radius=1,autopct='%1.1f%%',labeldistance=1.05)
ax.axis('equal')
# オプション:タイトルを追加
ax.set_title('Pie chart')
plt.show()
出典:TIOBEプログラミング言語ランキング、トップ8は7年間変わらず
ヒストグラム
ヒストグラムは、一定の区分においてデータがどこに多く分布しているのか確認する際に便利です。
# データ
N_points = 100000
data4 = np.random.randn(N_points)
n_bins = 20
# グラフ表示
fig, ax = plt.subplots()
ax.hist(data4, bins=n_bins,density=True) # density=Trueを追加すると確率密度になる。
ax.set_title('Histogram')
plt.show()
ax.histのbinsにおいて、母数をいくつのBinに分割するかを指定します。
また、ax.histにdensity=Trueを含めると、確率密度として出力できます。
散布図
散布図は、2つのデータのばらつきを表示するため、データ間にどういう相関があるのかを視覚的に確認するのに便利です。
以下の図では、それぞれ独立した正規分布に従う乱数を表示しているため無相関であることがわかります。
# データ
N = 1000
sigma = 10
x1 = sigma * np.random.randn(N)
y1 = sigma * np.random.randn(N)
# グラフ表示
fig, ax = plt.subplots()
ax.scatter(x1,y1,alpha=0.3)
ax.set_title('Scatter graph')
plt.show()
ax.scatterのalphaによってデータの透明度を指定でき、alpha=0で完全に透明になります。
バブルチャート
ax.scatterの第3引数を指定すると、バブルの大きさを設定できるため、バブルチャート にすることができます。
# データ
N = 50
x = np.random.rand(N)
y = np.random.rand(N)
volume = (30 * np.random.rand(N))**2 # バブルの大きさを指定
# グラフ表示
fig, ax = plt.subplots()
sc = ax.scatter(x, y, volume, alpha=0.3) # 第3引数にバブルの大きさを追加
ax.set_title('Bubble Chart')
plt.show()
ヒートマップ
ヒートマップは、2次元データ(行列)の個々の値を色や濃淡として表現した可視化グラフの一種です。(wikipedia:ヒートマップ)
# データ
dx, dy = 0.15, 0.05
y, x = np.mgrid[-3:3+dy:dy, -3:3+dx:dx]
z = (1 - x/2 + x**5 + y**3) * np.exp(-x**2 - y**2)
z = z[:-1, :-1]
z_min, z_max = -abs(z).max(), abs(z).max()
# グラフ表示
fig, ax = plt.subplots()
c = ax.pcolor(x, y, z, cmap='RdBu', vmin=z_min, vmax=z_max)
# オプション:タイトル、カラーバーの追加
ax.set_title('Heatmap') # タイトル
fig.colorbar(c, ax=ax) # カラーバー
plt.show()
レーダーチャート
レーダーチャートは、一般に5種類以上の複数の情報から特性を分析する際に便利なグラフです。
matplotlibの標準機能では簡単にレーダーチャートを作成する方法がなさそうですが、こちらのサイトに参考になるコードがあったので紹介します。
参考サイト:matplotlibでレーダーチャート(メモリも多角形)を描写する
# データ
values = np.array([51, 81, 46, 23, 68])
labels = [f"Data {i}" for i in range(1, len(values)+1)]
radar_values = np.concatenate([values, [values[0]]]) # 多角形を閉じるためにデータの最後に最初の値を追加
angles = np.linspace(0, 2 * np.pi, len(labels) + 1, endpoint=True) # レーダーチャートの角度を計算
# グラフ表示
fig = plt.figure(facecolor="w")
ax = fig.add_subplot(1, 1, 1, polar=True) # # 極座標でaxを作成
ax.plot(angles, radar_values)
ax.fill(angles, radar_values, alpha=0.2) # # レーダーチャートの内側を塗りつぶす
ax.set_thetagrids(angles[:-1] * 180 / np.pi, labels) # 項目ラベルの表示
ax.set_theta_zero_location("N") # 始点を上(北)に変更
ax.set_theta_direction(-1) # 時計回りに変更(デフォルトの逆回り)
ax.set_title("Radar Chart", pad=20)
plt.show()
終わりに
matplotlibを使った代表的なグラフの作成方法を紹介しました。
今後は個別のグラフの細かい調整方法も順次紹介していきたいと思います。
コメント