[python][matplotlib][seaborn]pythonでのグラフ、図の描写のまとめ-seabornでのグラフ作成方法を中心に-

seaborn

seabornを導入することでstylishなグラフ描写が可能になる。Rにおけるggplot2を超える威力を発揮するlibraryであるが、細かい点の変更でかなり時間を使ってしまうことが多く、一覧としてまとめる。

Libraryのimport

seabornは基本的にmatplotlibのwrapperである。また、DataFrame操作が前提になっているので、pandasのimportも必要である。以下は基本的なimportで、必要に応じて追加すると良い。

from matplotlib import pylab as plt
import seaborn as sns
sns.set()
import pandas as pd
import numpy as np
from scipy import stats

Styleの設定

上記のimportで

sns.set()

を宣言しているので、基本的にはこれで十分である。styleの変更を行う場合は、

sns.set_style(style = None, rc = None)

を用いる。Noneには以下を指定する。

style説明
white白の背景、軸にgridなし
ticks白の背景、軸のみにgridあり
whitegrid白の背景、gridあり
dark黒の背景、gridなし
darkgrid黒の背景、gridあり。何も指定しないとdefaultでこれになる
seabornの5つのstyle

rcはmatplotlibのrcを指定する。例えば色や線の種類の指定を行う時は、

sns.set_style(style = "darkgrid", rc = {"grid.color": ".6", "grid.linestyle": ":"})

などとする。実践にする時は’:’、破線にする時は’–‘、一点鎖線にする時は’.-‘とする。細かい設定はseabornの公式tutorialに。

色の指定について

色々設定方法があるが、一文字で指定するのが最も簡単。

color = "b"

などとすれば良い。色は全部で8種類。

一文字表記正式な表記
bblue
ggreen
rred
ccyanシアン
mmagenda赤紫
yyellow黄色
kblack
wwhite

Contextの設定

grid間の広さの調整を行う。公式tutorialはこちら

sns.set_context(context = None, font_scale = 1, rc = None)

contextは4種類ある。

context説明
paper
notebookdefault
talk
poster
seabornのcontextの説明

基本的に下に行くほど広くなる。rcの細かい設定は上のset_styleと同様にできる。

グラフの保存

基本的なことなので最初に記載する。作成したグラフを保存する時は、

plt.savefig("/Directory/name.png", dpi = )

と指定する。対応formatはeps, jpeg, jpg, pdf, pgf, png, ps, raw, rgba, svg, svgz, tif, tiff。その他細かく色々指定も出来るが、あまり使ったことはない。重要なのは、bbox_inches = “tight”とすることで、この指定をすることで、タイトルの文字が切れたりする不具合を防げる。

savefig(fname, dpi=None, facecolor='w', edgecolor='w',
        orientation='portrait', papertype=None, format=None,
        transparent=False, bbox_inches=None, pad_inches=0.1,
        frameon=None, metadata=None)

グラフの描写

以下では具体的にグラフを描写するが、ここではよく使われるTipsデータを用いる。seabornのグラフ操作自体はそれほど難しくない。大変なのは、グラフ化するにあたってデータを成型することである。

tips = sns.load_dataset("tips")
tipsデータセット

それぞれの変数は以下のようになっている。

  • total_bill: 支払った料金の総額
  • tip: 支払ったチップ額
  • sex: 支払った人の性別
  • smoker: 喫煙者かどうか
  • day: 来店した曜日
  • time: 来店した時間帯
  • size: 一緒に来店した人の人数

ヒストグラムの描写

以下のようにすればいい。

#ヒストグラムの描写
sns.distplot(tips["total_bill"], kde = True, bins = 20, rug = True)
#kdeでカーネル密度関数を、binsで区切りの変更を行う
#因数でvertical = Trueにするとグラフの向きを縦から横にできる。
ヒストグラム

2つのヒストグラムを重ねて表示する時は、以下のようにDataFrameの設定をする必要がある。ここらへんがseabornで大変でもあり、面白い部分でもある。基本的にseabornは一緒に選択したグラフは重ねて表示される。1枚のグラフの中に別々にグラフを配置する場合については、下で説明する。

#2つのヒストグラムを描写する。
lunch_tips = tips.query("time == 'Lunch'")
dinner_tips = tips.query("time == 'Dinner'")
sns.distplot(lunch_tips["total_bill"], kde = False, bins = 20, color = "r")
sns.distplot(dinner_tips["total_bill"], kde = False, bins = 20)
codeを同時に選択して描写する

カウントプロット

これも簡単。

#カウントプロット
sns.countplot(x = "smoker", data = tips)
カウントプロット

上のx =をy =にすると横向きになる。groupごとに色分けする時は、hueを用いる。

sns.countplot(x = "smoker", hue = "day", data = tips)
カウントプロット

ボックスプロット

コマンドは以下。これもy = をx = に変更すると横向きになる。何もしなくても4分位を表示してくれる。

sns.boxplot(y = "total_bill", data = tips)
ボックスプロット

実際には、データの分布が不明なので、stripplotと重ねると良い。

sns.boxplot(y = "total_bill", data = tips)
sns.stripplot(y = "total_bill", data = tips, jitter = True)

上記で、jitterをTrueにすると、点をバラけさせる事ができる。

ボックスプロットとストリッププロット

上のグラフは結構どぎつい色になるが、変更する時はpaletteやcolorを指定すれば良い。本当は\(\alpha\)で透過性を変更できればよいのだが、seabornでは設定自体がハードルが高く、色自体を変える方が簡単である。2つのデータをボックスプロットで比較する時は、

sns.boxplot(x = "time", y = "total_bill", data = tips)

で良い。

ボックスプロットで2つ以上のデータを比較

順番を変える時は、

sns.boxplot(x = "time", y = "total_bill", order = ["Dinner", "Lunch"], data = tips)

とする。これもhue = で属性を細かく見ることが出来る。

散布図

sns.scatterplot(x = "total_bill", y = "tip", data = tips)

とする。

散布図

質的変数の要素も合わせて指定する時はhueを用いる。

sns.scatterplot(x = "total_bill", y = "tip", hue = "time", data = tips)
散布図、hueあり

色ではなくスタイルを変える時はstyleを用いる。

sns.scatterplot(x = "total_bill", y = "tip", style = "time", data = tips)
散布図、style変更

重なって見にくい時はさらにalphaを指定する。scatterplotでは何故か\(\alpha\)の指定が可能だ。

sns.scatterplot(x = "total_bill", y = "tip", hue = "time", alpha = 0.6, data = tips)
散布図、alpha指定

複数のグラフを1枚の図に配置する

これが最も用いるが、fix, axを指定するのが簡単。

#複数のグラフを1枚に描写
fig, ax = plt.subplots(1, 2, sharey = False, figsize = (10, 10))
sns.regplot(x = "total_bill", y = "size", data = tips, ax = ax[0])
sns.countplot(x = "size", data = tips, ax = ax[1])
複数配置

たとえば\(2\times 2\)の図で、右下の部分を空白にしたいときは、以下のようにすると良い。

複数の図を\(1\)枚にまとめる場合、大切なのがtitleやlabelなどの配置、および軸を共通にするかどうかなどであろう。100のグラフを1枚にまとめる時など、勘だよりのcodingで時間を食うことがある。下は研究で作成したグラフであるが、100以上の変数について横軸グラフを作成し、かなりbusyなグラフである。

ax[1][1].axis("off")
seabornで作成したグラフの実例、一部モザイクで隠している

このグラフでは

labels = ["0", "1"]
sns.barplot(data = dt, x = "outcome, estimator = len, y = "category", hue = "category", capsize = .2, errwidth = errwidthvalue, ax = ax[i], orient = "h")
h, _ = ax[i].get_legend_handles_labels()
       ax[i].legend(h, labels, title = "", loc = "center right")
       ax[i].set_xlabel("xaxis (%)", fontsize = 12)
       ax[i].tick_params(labelleft = False)

というコードをfor文に組み込んで使用している。見ての通り、seabornのlegend設定はなかなか面倒である。xlabelやtick_paramsの設定については追記する予定である。

コメント

  1. […] おおまかな作図については過去記事を参照。https://denovo2021.com/2021/11/12/pythonmatplotlibseabornpython%e3%81%a7%e3%81%ae%e3%82%b0%e3%83%a9%… […]

  2. […] 2015年東京大学理系数学問題1pythonでのグラフ、図の描写のまとめ-seabornでのグラフ作成方法を中心に-seabornで細かい図の設定を調整する […]

タイトルとURLをコピーしました