Pythonは覚えることが、とにかく多い(涙、と言うより毎日泣いている)
今回は備忘録として、matplotlib.pyplotでヒストグラムをいくつか作ってみました。
import numpy
import matplotlib.pyplot as plt
#適当にランダムなデータを作る。
#random.normalは「ランダムな正規分布」を作る。(平均,分散,件数)
data1 = numpy.random.normal(70, 10, 300)
data2 = numpy.random.normal(20, 20, 300)
data3 = numpy.random.normal(50, 30, 300)
data4 = numpy.random.normal(98, 85, 300)
##普通にグラフを描いてみる&2つのグラフを重ねてみる。
ヒストグラムを描くときはコレ。
ply.hist(データ,色,透明度)
グラフのタイトルや軸の説明を設定し、表示する。
別のデータで重ねてヒストグラムを描く。
重ねるために色を変えて alpha で半透明にしている
plt.hist(data1, color='red', alpha=.5)
plt.hist(data2, color='blue', alpha=.5)
plt.title('histgram test')
plt.xlabel('x axis')
plt.ylabel('y axis')
plt.show()
##複数のグラフをレイアウトして並べてみる
複数のグラフを描くときはこれ。
plt.figureメソッドのadd_subplot(行,列,位置)
histメソッドで(data)を与える。
axはaxis=軸のこと。
・サブプロット(グラフ)を作りレイアウトする
-> 3x3 分割の 1 番(左上)にグラフを置く
※ひとつ目だけ「色指定、半透明」にした。
・データを与えてヒストグラムを描く
・2つ目のグラフを作る
-> 3x3 分割の左上から数えて6番目の場所にグラフを置く
・3x3 分割の左上から数えて8番目の場所にグラフを置く
fig = plt.figure()
ax1 = fig.add_subplot(3, 3, 1)
ax1.hist(data1,color='red', alpha=.5)
ax2 = fig.add_subplot(3, 3, 6)
ax2.hist(data2)
ax3 = fig.add_subplot(3, 3, 8)
ax3.hist(data3)
plt.show()
##縦横2つずつ、計4つのグラフを並べてみる
行列形式でグラフを配置
plt.subplot(行,列)で形状指定
行列の指定位置にdataを置く。
axesはaxisの複数形で複数の軸=2次元以上のこと。
また、pltではtitleがplt.titleで表現できるが、axesではaxes.set_titaleとsetが余計に入る点に注意。
・[0,0] 左上にレイアウトされたグラフ
・[0,1] 右上(以下同文)
・[1,0] 左下(以下同文)
・[1,1] 右下(以下同文)
fig2, axes = plt.subplots(2, 2)
axes[0, 0].hist(data1)
axes[0, 0].set_title('data1')
axes[0, 1].hist(data2)
axes[0, 1].set_title('data2')
axes[1, 0].hist(data3)
axes[1, 0].set_title('data3')
axes[1, 1].hist(data4)
axes[1, 1].set_title('data4')
plt.show()
なるほど、なるほど。
でも、これって敢えて行列形式で練習しているけど、さっきの配置指定でも可だよね。
fig = plt.figure()
ax1 = fig.add_subplot(2, 2, 1)
ax1.hist(data1,color='red', alpha=.5)
ax2 = fig.add_subplot(2, 2, 2)
ax2.hist(data2)
ax3 = fig.add_subplot(2, 2, 3)
ax3.hist(data3)
ax4 = fig.add_subplot(2, 2 ,4)
ax4.hist(data4)
plt.show()
うん、やっぱり同じ。よし!
##この例をループを使ってかっこつけてやってみる
ループを使うのでデータはリストに入っている必要がある
data_list=[・・・]
注)fig.add_subplotのsubplotは単数形だが、fig3, axes2=plt.subplotsは複数形
・縦横2つずつのグラフが2次元配列に入っているが、ループで処理したいので1次元配列として(直列に)並べる。なるほど。
・ループでデータやタイトルをセットしていく
data_list = [data1, data2, data3, data4]
fig3, axes2 = plt.subplots(2, 2)
ax = axes2.ravel()
for i in range(4):
ax[i].hist(data_list[i])
ax[i].set_title('data' + str(i + 1))
ax[i].set_xlabel('x axis')
ax[i].set_ylabel('y axis')
plt.show()
うん、うん同じ。なんとな~くわかってきた。