Pythonでグラフを描画するだけなら数行でかけますが、体裁を整えるとなったら意外と大変です。
ネットで検索しても情報が散らばっていてほしい情報を集めるのに苦労しました。
そこで、とりあえず最低限の情報だけまとめました。
目次
サンプルコードはこちらです。
良ければサンプルコードで使用したExcelファイルもご使用ください。
サンプルデータをダウンロード
このコードで描画されるグラフも一緒に載せておきます。
なお、今回はデータの読み込みについては割愛します。
データの読み込みについて解説した記事はこちら
import pandas as pd
import glob as gb
import matplotlib.pyplot as plt
import matplotlib as mpl
import matplotlib.pyplot
plt.rcParams['font.family'] = 'Times New Roman'
path = "C://Users//hogehoge//ave.xlsx"
file = pd.read_excel(path, header = None)
data0 = file.iloc[[0, 5, 10], 0].reset_index(drop = True)
data1 = file.iloc[[4, 9, 14], 1].reset_index(drop = True)
data2 = file.iloc[[4, 9, 14], 2].reset_index(drop = True)
data3 = file.iloc[[4, 9, 14], 3].reset_index(drop = True)
#squeeze = Falseでグラフの位置を2次元配列で指定可能になる
fig, ax = plt.subplots(3, 1, squeeze = False, tight_layout = True)
ax[0, 0].plot(data0, data1, marker = 'o')
ax[0, 0].plot(data0, data2, marker = '^', markersize = 10)
#######################################################
#第2軸の設定
ax2 = ax[0, 0].twinx()
ax2.plot(data0, data2, marker = 'X', color = 'g')
ax2.yaxis.set_minor_locator(mpl.ticker.AutoMinorLocator(5))
ax2.tick_params(which='minor', length=4, color='r')
#######################################################
#1段目のグラフの設定
ax[0, 0].xaxis.set_minor_locator(mpl.ticker.MultipleLocator(0.05))
ax[0, 0].xaxis.set_major_locator(mpl.ticker.MultipleLocator(0.2))
ax[0, 0].tick_params(
axis = 'y', #設定を変更する軸
which='major', #主目盛か#補助目盛かの選択
length=10, #目盛の長さ
width = 5, #目盛の太さ
color='y', #目盛の色
direction = 'inout', #目盛の向き in(内側) out(外側) inout(両側)から選択
labelsize = 18, #目盛の数字の大きさ
labelfontfamily = 'Impact', #目盛の数字のフォント
labelcolor = '#20df33' #目盛の数字の色
)
ax[0, 0].set_xlabel('Time', fontname = 'MS Gothic')
ax[0, 0].set_ylabel('Time', fontfamily = 'Times New Roman')
ax[0, 0].set_xlim(0, 0.5)
ax[0, 0].grid(
which = 'major', #which = major(主目盛)、minor(補助目盛), both(両方)
axis='both' #x軸、y軸、both(両方)
)
ax[0, 0].legend(['data1', 'data2'], prop = {'family':'Yu Mincho', 'size':12})
######################################################
#2段目のグラフの設定
ax[1, 0].scatter(data0, data2, marker = '*', s = 40, color = 'k')
ax[1, 0].scatter(data0, data3, marker = 'D', s = 10)
ax[1, 0].grid(axis='x')
ax[1, 0].set_ylim(0, 10)
######################################################
#3段目のグラフの設定
ax[2, 0].set_xticks([0.1, 0.6, 1.1])#あらかじめラベルを付けたい位置にラベルを設定しておく
######################################################
#棒グラフを配置
ax[2, 0].bar([0, 0.5, 1], data2, align = 'edge', width = 0.1)
ax[2, 0].bar([0.1, 0.6, 1.1], data1, align = 'edge', width = 0.1)
######################################################
ax[2, 0].set_xticklabels(['one', 'two', 'three'])#設定したラベルを文字に置き換え
plt.show()
複数段グラフの描画
今回使用するライブラリはmatplotlibです。
インストールしていない方は以下のようにインストールしてください。
pip install matplotlib
matplotlibでのグラフ作成ではpyplotを使用した方法と、オブジェクト指向と呼ばれる書き方でグラフを作成する方法があります。
ネットで調べるとpyplotを使用する記事が多くでてくるように感じます。
少し慣れが必要かもしれませんが、個人的にはオブジェクト指向で書いたほうがグラフのどこを操作しているのか分かりやすい気がします。
今回はオブジェクト指向での書き方を紹介します。
まずはグラフを描画する台紙(figure)と軸(Axes)を生成します
import matplotlib.pyplot as plt
fig, ax = plt.subplots(3, 1, squeeze = False, tight_layout = True)
subplots(行数, 列数)です。
行数または列数が1のときはaxが1次元の配列になります。
場合によって配列の形が変わると不都合な場合にはsqueeze = Falseと書くことで常に配列が2次元で作成されます。
また、tight_layout = Trueとすることで凡例などのグラフの要素が見切れたりしないよういい感じに配置してくれます。
余談ですが、最初に以下のように記述するとmatplotlibの設定を変更して、グラフ全体のデフォルトのフォントを変更できます。
plt.rcParams['font.family'] = 'Times New Roman'
マーカー付き折れ線グラフ
グラフを描画したい軸を配列で指定してプロットします。
複数の系列を重ねて描画したい時は、同じ軸を指定して同じようにプロットするだけです。
以下にマーカー付き折れ線グラフを1段目のグラフに描画する例を示します。
ax[0, 0].plot(data0, data1, marker = 'o')
ax[0, 0].plot(data0, data2, marker = '^', markersize = 10)
オプションでマーカーを指定しなければマーカー無しの折れ線グラフを作成できます。
マーカーの形は種類が多すぎて紹介しきれないので、公式ドキュメントを参考にしてください。
マーカーの大きさや色もオプションで変更可能です。
上記の例ではmarkersize = 10で大きさを変更しています。
2軸グラフの描画
2軸グラフの設定方法は以下の通りです。
ax2 = ax[0, 0].twinx()
2軸を作りたい軸に対してtwinx()メソッドを使用すると2個目のy軸を作成できます。
2個目のx軸を作りたい場合はtwiny()です。
通常の軸と同じようにプロットするだけです。
ax2.plot(data0, data2, marker = 'X')
軸の設定
軸ラベルの設定
軸ラベルは次のように設定します。
ax[0, 0].set_xlabel('Time', fontname = 'MS Gothic') #x軸のラベル
ax[0, 0].set_ylabel('Time', fontfamily = 'Times New Roman') #y軸のラベル
フォントの設定はオプションです。フォントはfontname、もしくはfontfamilyで指定します。
補助目盛追加
各軸に補助目盛を個別に追加するには以下のように書きます。
import matplotlib as mpl
ax2.xaxis.set_minor_locator(mpl.ticker.MultipleLocator(0.05)) #x軸に補助目盛を追加
ax2.yaxis.set_minor_locator(mpl.ticker.AutoMinorLocator(5)) #y軸に補助目盛を追加
MultipleLocator()の引数に数値を渡して補助目盛の数値の刻み幅を指定します。
AutoMinorLocator()の引数に数値を渡して補助目盛の分割数を指定できます。
両方の軸の補助目盛をまとめて有効にする場合は以下のとおりです。
ただし、有効にするだけで間隔は設定できません。
ax[0, 0].minorticks_on()
目盛範囲の設定
目盛の範囲を設定します。
ax[0, 0].set_xlim(0, 0.5) #x軸
ax[0, 0].set_ylim(0, 0.5) #y軸
ax2.xaxis.set_major_locator(mpl.ticker.MultipleLocator(0.05)) #x軸の目盛の刻み幅を変更
ax2.yaxis.set_major_locator(mpl.ticker.AutoMinorLocator(5)) #y軸の目盛の分割数を変更
目盛の刻み幅を変更するには補助目盛を設定したときと同じようなことをすればいいだけです。
set_minor_locator()をset_major_locator()に変えるだけです。
目盛の装飾
目盛の長さや色の指定は次の通りです。
このあたりの設定ができれば、概ね作りたい軸が作れるかと思います。
ax[0, 0].tick_params(
axis = 'y', #設定を変更する軸
which='major', #主目盛か#補助目盛かの選択
length=10, #目盛の長さ
width = 5, #目盛の太さ
color='y', #目盛の色
direction = 'inout', #目盛の向き in(内側) out(外側) inout(両側)から選択
labelsize = 18, #目盛の数字の大きさ
labelfontfamily = 'Impact', #目盛の数字のフォント
labelcolor = '#20df33' #目盛の数字の色
)
colorは目盛自体の色、labelcolorは目盛の数字の色です。
また、色の指定は公式ドキュメントに詳しく記載されています。
簡単に指定したい場合は’r’、’k’のように色の名前で指定します。
細かい指定がしたい場合はRGBやカラーコードで指定するのが良いかと思います。
グリッドの表示、非表示
グリッドを表示します。
ax[0, 0].grid(
which = 'major', #which = major(主目盛)、minor(補助目盛), both(両方)
axis='both' #x軸、y軸、both(両方)
)
引数を省略してgrid()とした場合はx軸、y軸の主目盛にグリッドが表示されます。
凡例
凡例の表示方法は次の通りです。
ax[0, 0].plot(data0, data1, label = 'data1', marker = 'o')
ax[0, 0].plot(data0, data2, label = 'data2', marker = '^', markersize = 10)
ax[0, 0].legend()
################################################################################
ax[0, 0].legend(['data1', 'data2'])
plotのオプションにlabel = ‘凡例’を追加した後、legend()で表示する方法と、legend()に引数としてラベルの配列を渡す方法があります。
凡例の詳細設定は、次のようにpropで設定します。
ax[0, 0].legend(['data1', 'data2'], prop = {'family':'Yu Mincho', 'size':12})
散布図
散布図はscatter()でプロットします。
ax[1, 0].scatter(data0, data2, marker = '*', s = 40, color = 'k')
ax[1, 0].scatter(data0, data3, marker = 'D', s = 10)
マーカーの形の指定方法はマーカー付き折れ線の時と同じです。
マーカーの大きさはmarkersizeではなくs = 10といった感じで指定します。
色はcolorで選べます。
棒グラフ
棒グラフはbar()でプロットします。
ax[2, 0].bar([0, 0.5, 1], data2, align = 'edge', width = 0.1)
bar(x座標, 棒グラフの高さ)で記述します。
alignとwidthはオプションです。
alignは棒の中心をx座標に合わせる(‘center’)か、左端(‘edge’)をx座標に合わせるかを選びます。
widthは棒の幅です。
複数の系列を同じ棒グラフにプロットする場合はほかのグラフと同様につぎのように書きます。
ax[2, 0].bar([0, 0.5, 1], data2, align = 'edge', width = 0.1)
ax[2, 0].bar([0.1, 0.6, 1.1], data1, align = 'edge', width = 0.1)
このとき、棒グラフがかさならないようにx座標を調整する必要があります。
棒グラフの幅(width)と各系列のx座標をあわせることで、棒グラフを横並びに描画できます。
イメージはこんな感じです。
棒グラフのx軸を文字列で設定する場合は、最初にx軸をデータの数だけ目盛を設定して、最後に置き換えるのが楽なようです。
ax[2, 0].set_xticks([0.1, 0.6, 1.1])#あらかじめラベルを付けたい位置にラベルを設定しておく
######################################################
#棒グラフを配置
ax[2, 0].bar([0, 0.5, 1], data2, align = 'edge', width = 0.1)
ax[2, 0].bar([0.1, 0.6, 1.1], data1, align = 'edge', width = 0.1)
######################################################
ax[2, 0].set_xticklabels(['one', 'two', 'three'])#設定したラベルを文字に置き換え
おわりに
今回は以上です。
今回は比較的出番が多そうなグラフの設定をご紹介しました。
ぜひ、サンプルコードを色々変更してお好みのグラフをつくってください。
また、より良い方法等ありましたら教えてくださると幸いです。
最後までありがとうございました。
コメントを残す