こんにちは、ヒガシです。
このページではpython-matplotlibを使って、以下のように複数のグラフを整列させて一括作成する方法をご紹介していきます。
事前にデータさえ準備してしまえば、あとは整列させる際の行数、列数を指定するだけで簡単に作成可能です。
使用するサンプルデータのご紹介
今回のメインテーマはグラフを作成することなので、まずは適当にサンプルデータを作っておきましょう。
以下がそのコードです。
import numpy as np
import matplotlib.pyplot as plt
import math
#グラフ用のデータ作成
x=np.linspace(0,360,361)
y1=np.sin(2*math.pi/360*x)
y2=np.sin(2*math.pi/360*x*2)
y3=np.sin(2*math.pi/360*x*3)
y4=np.sin(2*math.pi/360*x*4)
y5=2*np.sin(2*math.pi/360*x)
y6=3*np.sin(2*math.pi/360*x)
y7=4*np.sin(2*math.pi/360*x)
y8=5*np.sin(2*math.pi/360*x)
これでy1~y8までのデータを作成することができました。
以降で紹介するグラフ作成においては、横軸をxに縦軸をそれぞれのyにしたグラフを一括作成する方法をご紹介していきます。
データをリストに入れておく
今回紹介するスキルは、for分を使って一気に処理していきます。
そのため先ほど作成したデータをひとまとめにしておく必要があります。
以下がその方法です。
y_list=[y1,y2,y3,y4,y5,y6,y7,y8]
今回の場合はこれでOKです。
[ ] の中はあなたが使用したいデータの数や変数名に応じて書き換える必要がありますので、適宜変更しましょう。
ラベル名、タイトルリストも作成しておく
今回紹介するコードは作成したグラフにラベル、タイトルも付けるようになっています。
というわけでのそのためのリストも作成しておきましょう。
label_list=['y1','y2','y3','y4','y5','y6','y7','y8']
title_list=['Y1','Y2','Y3','Y4','Y5','Y6','Y7','Y8']
ここもあなたの状況に合わせて適宜変更してください。
これで事前準備は完了です。
複数グラフを行数、列数指定で一括作成するサンプルコード
それではこの記事の本題に入っていきましょう。
先ほどまでに準備したデータやラベルのリストを使い、行数&列数を指定してグラフを一括作成してみます。
以下がそのサンプルコードです。
※先ほどまでのコードの続きという立ち位置で書いています。
#整列させるグラフの数を指定(縦、横)
grf_row=2
grf_col=4
#グラフ作成
fig = plt.figure(figsize = (grf_col*4,grf_row*4))
ax_list=[]
for j in range(grf_row):
for i in range(grf_col):
if (j*grf_col+i)<len(y_list):
ax_list.append(fig.add_subplot(grf_row, grf_col, j*grf_col+i+1))
ax_list[j*grf_col+i].plot(x, y_list[j*grf_col+i], color='blue', label=label_list[j*grf_col+i])
#X,Y軸のラベル名を指定する
ax_list[j*grf_col+i].set_xlabel('X',fontsize=14)
ax_list[j*grf_col+i].set_ylabel('Y',fontsize=14)
#レジェンド、タイトルの設定
ax_list[j*grf_col+i].legend(loc ='upper right',fontsize=14)
ax_list[j*grf_col+i].set_title(label_list[j*grf_col+i],fontsize=14)
#X,Y軸の最大値、最小値の設定
ax_list[j*grf_col+i].set_xlim(0,360)
ax_list[j*grf_col+i].set_ylim(-5,5)
#グラフ間の間隔指定
plt.subplots_adjust(wspace=0.4, hspace=0.6)
plt.savefig('sample1.jpg',dpi=300)
plt.show()
あなたがやることは、2,3行目の整列させる際のグラフの行数、列数の指定と、19,20行目の作成されたグラフの横軸、縦軸の範囲指定くらいですね。
全体のプログラムのご紹介
ここまでコードを細切れでご紹介してきたので、ここで全体のコードをご紹介しておきます。
import numpy as np
import matplotlib.pyplot as plt
import math
#グラフ用のデータ作成
x=np.linspace(0,360,361)
y1=np.sin(2*math.pi/360*x)
y2=np.sin(2*math.pi/360*x*2)
y3=np.sin(2*math.pi/360*x*3)
y4=np.sin(2*math.pi/360*x*4)
y5=2*np.sin(2*math.pi/360*x)
y6=3*np.sin(2*math.pi/360*x)
y7=4*np.sin(2*math.pi/360*x)
y8=5*np.sin(2*math.pi/360*x)
#データを一つのリストに格納しておく
y_list=[y1,y2,y3,y4,y5,y6,y7,y8]
#ラベル名、タイトルのリスト作成
label_list=['y1','y2','y3','y4','y5','y6','y7','y8']
title_list=['Y1','Y2','Y3','Y4','Y5','Y6','Y7','Y8']
#ここからがグラフ作成処理
#整列させるグラフの数を指定(縦、横)
grf_row=2
grf_col=4
#グラフ作成
fig = plt.figure(figsize = (grf_col*4,grf_row*4))
ax_list=[]
for j in range(grf_row):
for i in range(grf_col):
if (j*grf_col+i)<len(y_list):
ax_list.append(fig.add_subplot(grf_row, grf_col, j*grf_col+i+1))
ax_list[j*grf_col+i].plot(x, y_list[j*grf_col+i], color='blue', label=label_list[j*grf_col+i])
#X,Y軸のラベル名を指定する
ax_list[j*grf_col+i].set_xlabel('X',fontsize=14)
ax_list[j*grf_col+i].set_ylabel('Y',fontsize=14)
#レジェンド、タイトルの設定
ax_list[j*grf_col+i].legend(loc ='upper right',fontsize=14)
ax_list[j*grf_col+i].set_title(label_list[j*grf_col+i],fontsize=14)
#X,Y軸の最大値、最小値の設定
ax_list[j*grf_col+i].set_xlim(0,360)
ax_list[j*grf_col+i].set_ylim(-5,5)
#グラフ間の間隔指定
plt.subplots_adjust(wspace=0.4, hspace=0.6)
#作成したグラフの保存
plt.savefig('sample1.jpg',dpi=300)
#グラフをコンソール上に表示
plt.show()
要所でコメントを付けているのでだいたい何をやっているかわかると思います。
今回はX軸、Y軸の名前はすべて共通にしていますが、ここもリスト化しておけば各グラフに対して変更できそうですね。
サンプルコードの実行結果確認
それでは先ほどのコードを実行してみましょう。
まずは、先ほど紹介した通り、
grf_row=2
grf_col=4
で実行してみます。
以下のグラフが出力されました。
次は、
grf_row=3
grf_col=3
で実行してみます。
3行、3列だと9つ分の場所があるわけですが、今回は8つのした準備していません。この場合は上の結果のように空白のままになるようにしています。
実に便利ですね。ぜひ業務効率化にご活用ください。
おわりに
というわけで今回はpython-matplotlibを使って、複数グラフをfor分を使って一括作成する方法をご紹介しました。
データ処理の際などにぜひご活用ください。
このように、私のブログでは様々なスキルを紹介しています。
今は仕事中で時間がないかもしれませんが、ぜひ通勤時間中などに他の記事も読んでいただけると嬉しいです。
⇒興味をもった方は【ヒガサラ】で検索してみてください。
確実にスキルアップできるはずです。
最後に、この記事が役に立ったという方は、ぜひ応援よろしくお願いします。
↓ 応援ボタン
にほんブログ村
それではまた!
Follow @HigashiSalary
コメント