Matplotlib をうまく扱う
seaborn は matplotlib をベースに作られていますので matplotlib をうまく使えるようになることで、グラフの表示についてうまく調整ができるようになります。
ここでは、matplotlib の使い方の基礎を見てみます。
インポート
一般的に matplotlib は下記の手段でインポートされます。
import matplotlib.pyplot as plt
グラフエリアを指定する。
様々な記述方法がありますが、汎用性が高く使い勝手が良い方法を代表として説明します。
fig, ax = plt.subplots(1,1,dpi = 300)
# or
fig, ax = plt.subplots(1,1,figsize = (10, 10))
ちなみに、fig はグラフ全体のキャンパス、ax は実際のグラフとなります。2 つ以上のグラフを定義したい場合は ax が複数あると考えてください。
定義をするときはどちらの方法でも好きな方を選べば良いのです。何も考えないときは dpi で指定すると自動でいい感じにしてくれますので、私はこちらを好んで利用しています。
バックグランドカラー
バックグランドカラーを指定するときは fig.set_facecolor("色名など")で指定します。
fig.set_facecolor("grey")
グラフの縁の色を変更する
グラフの端の色を変更する場合は edgecolor と linewidth を指定します。
fig.set_edgecolor("blue")
fig.set_linewidth(2)
小まとめ:グラフの外側の変更は fig をいじる
グラフの外側は fig.set_xxxx で色々なパラメータを設定できます。毎回同じ書き方をするのであれば、一括で設定したいですよね。そんなときはこのように記述します。
fig, ax = plt.subplots(1,1,
dpi = 300,
facecolor = "grey",
edgecolor = "blue",
linewidth= 2,
)
細かな設定は他にもありますので、詳しくはこちらを参照してください。上記の例にもあるとおり、後から個別に設定する場合は set_xxxx で指定することができます。
グラフのレイアウトを定義する
ひとつのグラフを記載するときは上記の fig で定義しておけば問題ありません。しかし、ふたつ以上のグラフを同時に記載したいこともあります。
そういうときは次のように記載します。
fig, ax = plt.subplots(2,3, # 表示したいグラフの行数、列数
# fig kwags
dpi = 300,
facecolor = "grey",
edgecolor = "black",
linewidth= 2,
# subplots kwags
sharex = True, # 2行以上表示するときx軸を共通で利用するかどうかを定義します。
sharey = True, # 2列以上表示するときy軸を共通で利用するかどうかを定義します。
width_ratios = (1,2,1), # 各列の幅を割合で定義します。列数と同じ要素数としなければなりません。
height_ratios = (1,1), # 各行の高さを割合で定義します。行数と同じ要素数としなければなりません。
)
出力結果はこちらです。
きれいに並びますね。
普段から plt.subplots で定義をしておくと、凝ったデザインを作りたいときもすぐに拡張できるので便利ですね。
その他の細かい設定はこちらを参照してください。
単一のグラフを描く
上記はグラフを書く上で必要な領域を指定するものでした。ここからは実際にグラフを書くためのパラメータを見てみます。
グラフの定義部分は同じです。
fig, ax = plt.subplots(1,1,
# fig kwags
dpi = 300,
facecolor = "white",
edgecolor = "black",
linewidth= 2,
)
実施にグラフを書いていきます。fig と同時に出てきた ax が実際のグラフとなりますので、その中にグラフデータを入れていきます。今回は散布図です。
import numpy as np # 乱数を発生させるために利用します。
data = np.random.randn(1000,2)
ax = plt.scatter(x=data[:,0], y=data[:,1])
とりあえずなにか表示されましたね。しかし、これでは何のデータなのかわかりません。
グラフのタイトルや軸名、単位を記載する
グラフは軸と数値、点だけで表現することはまれです。軸名や単位という情報があって、どのようなグラフかを把握できます。
タイトルや軸名、単位は次のように表記します。
# matplotlibの場合はグラフ描写の前に定義する。
ax.set_ylabel("y data / unit") # y軸のラベル
ax.set_xlabel("x data / unit") # x軸のラベル
ax.set_title("Graph Title") # グラフタイトル
ax = plt.scatter(x=data[:,0], y=data[:,1])
ax.set_ylabel(文字列)とすることで軸名を定義できます。
グラフの表示範囲を定める
何も設定しない場合、グラフの表示範囲は自動でフィットするようになります。したがって、0 から表示したいのに-1 などと負の値から始まることも珍しくありません。
そこで、グラフの表示範囲を定義することであなたが表示したいグラフを描写できます。指示の方法は set_xlim(最小値, 最大値) または set_ylim(最小値, 最大値)を指示することです。
ax.set_xlim(-5,5)
ax.set_ylim(-5,5)
結果はこちらのようになります。
複数のグラフを同時に描写する
散布図の隣にヒストグラムを表示することやパレート図のように頻度とその割合を同時に表現したいといった要望は必ず存在します。
グラフレイアウトの定義の項目でも取り扱った複数のグラフを表示を利用して表現してみましょう。今回は分析でよく登場するパレート図を作成したいと思います。
まずはパレート図とするためのデータ作成です。
data = pd.DataFrame({"data_name":["A","B","C","D","E","F"],"value":[50,25,10,5,5,5]})
data["ratio"] = data.value/data.value.sum() # 各データが全体に占める割合を算出します。
data["ratio_cumsum"] = data.ratio.cumsum() # 割合を項目ごとに積算していきます。
これにより得られるデータはこのとおりです。
data_name に対する value と ratio_cumsum を用いてパレート図を作成していきます。まずはグラフエリアの宣言からです。概要は前述と同じなのですが、少し変えた部分があります。
fig, (ax1, ax2) = plt.subplots(2,1,
# fig kwags
dpi = 300,
facecolor = "white",
edgecolor = "black",
linewidth= 2,
# subplots kwags
sharex = True,
sharey = False,
squeeze=True,
# width_ratios = (1),
height_ratios = (2,8),
)
今回グラフ 2 種類別々に作成するため、fig, (ax1, ax2) の部分では ax が 1,2 の 2 種類あります。
定義が完了したので各 ax に対してグラフを当てはめます。
ax1.plot(data.ratio_cumsum)
ax1.set_ylim(0,1)
ax2.bar(x = data.data_name, height=data.value)
ax1.set_ylabel("Ratio")
ax2.set_xlabel("Category")
ax2.set_ylabel("Count")
matplotlib では ax1.プロットの種類(引数)と言うかたちで宣言をしてプロットしていきます。ax1 を ax...とすることで次々にプロットを作成できます。
最後に各グラフにラベルをつければ完成です。
グラフ表示の微調整
縦横のアスペクト比
縦軸、横軸の比が大切なグラフの場合はよしなにしてもらっては困りますよね。そんなときは set_aspect("equal")を使用します。
グラフがひとつの場合は fig, ax = plt.subplots(1,1,figsize = (10, 10))で figsize を 1:1 などの狙った比率を指定することで制御可能です。複数のグラフでは計算しながら当てはめてください。