今回の記事では、go.Violin() を用いた Violin Plot (バイオリン図)の描き方について紹介していきます!
そもそもバイオリン図って何?という人もいるかと思いますが、箱ひげ図と同様にデータの分布を可視化することができるこの関数の基礎的な使い方をまとめていきます!
Violin plot とは?
Violin Plot とは、 数値データの分布を可視化する方法の一つで、似たような図に箱ひげ図があります。
具体的には、カーネル密度推定を行った結果を描画しているのですが、その形がバイオリンに似ていることからこの名前がついているらしいです。
また、箱ひげ図と一緒に描画されることも多く、Plotlyでもオプションで箱ひげ図を重ねて表示するか否かの設定をすることができます!
これだけは押さえたい書き方 3選!
この Violin Plot のグラフには細かな設定が多くあり、いろんなオプションがありますが、ここではその中から厳選して最低限押さえておくと良い書き方について紹介します!
この3つをおさえることで下の図を書けます!
(この図は、国別の平均寿命(lifeExp)を Violin Plotにしたものになります。
左側の点にカーソルを合わせるとその点がどこの国の平均寿命かわかりますが、上側には先進国と呼ばれる国が集まっていることがわかりますね)
1. (必須) y : 値の設定
他の2つは、オプションなのでなくても描画できますが、Violin Plotで唯一必須の設定値です。
データの分布を見たいリスト (データフレームであれば カラム ) を指定します!
y = "表示させたい値のリスト or シリーズ"
#(例)
y = df['price']
2. box_visible : 箱ひげ図の表示
ここの設定を Trueにすることで、箱ひげ図も一緒に描画することができます!
box_visible = True
3. points : データ点の表示
データの分布とともに、各データ点も表示させたい場合は pointsを 'all' と設定することで全ての点を表示することができます!
points = 'all'
サンプルコード
上の図では、ここまでにまとめた3つの設定を行い、さらにグラフをわかりやすくするために2つの設定を加えていましたが、その全体のコードを載せておきます!
プラスの2つの設定に関しては、グラフ共通のオプションですが、"name"と"text"です。
name : 各グラフの凡例を設定
text : 点をプロットしたときに、表示させるテキスト情報を追加設定
(今回の場合は、国の文字列情報を追加しました!)
# 平均寿命の分布
import pandas as pd
import plotly.express as px
import plotly.graph_objects as go
# データの準備
df = px.data.gapminder()
df_2007 = df[df['year']==2007]
# グラフの描画
fig = go.Figure()
fig.add_trace(
go.Violin(y= df_2007['lifeExp'],
box_visible=True,
points='all',
name = "lifeExp",
text = df_2007['country']
)
)
fig.update_layout(yaxis_zeroline=False)
fig.show()
複数の Violin plot を描画+αの設定
ここまで、最低限押さえておきたいポイントについて焦点をあててまとめました。
ただ、実際にデータをみるときだと、単独のデータの分布をみるというより、複数のデータの分布を描画して比較したいときの方が多いと思うので、「複数のデータの分布」を表示して比較する!といったことをテーマにまとめていきます!
題材は、上と同じく国別の平均寿命なのですが、下の図のように地域別に分けることができると分析しやすいですよね! ヨーロッパ と アフリカの分布の差などを一目瞭然です!
x 横軸の設定
複数のグラフを横に並べて表示する方法は、こちら(Plotly 複数のグラフを並べて表示 (make_subplots, set_subplots)) で紹介した通り subplotを使う方法もありますが、Violin plotでは、xを設定するだけで大丈夫です!
ここの設定としては、 x は yの同じサイズのリストであり、yの各点に対応するラベルとしてxを設定する必要があります。ちなみに、データフレームから複数のviolin plotを描きたいときに私が使っている Tipsは次のようなコードです。
categories = df['横軸にしたいカラム'].unique()
for cat in categories:
x = np.full(len(df),cat)
今回の平均寿命の例では、地域(continent)別にするために、continentカラムの要素を取り出し、それをfor文で回して、一つずつグラフを描画しています。
meanline_visible : 平均値の表示
box_visibleでは、箱ひげ図の中央値は表示されますが、平均値は表示されません。
そこでこのオプションを使うことで、平均値を表示できます!
meanline_visible=True
opacity : 不透過度
透過率を設定 (デフォルトは 1 で 0 ~ 1で設定可能)
サンプルコード
# 大陸別の平均寿命の分布
import pandas as pd
import numpy as np
import plotly.express as px
import plotly.graph_objects as go
# データの準備
df = px.data.gapminder()
df_2007 = df[df['year']==2007]
# グラフの描画
categories = df_2007['continent'].unique()
fig = go.Figure()
for cat in categories:
fig.add_trace(go.Violin( x = np.full(len(df_2007),cat),
y= df_2007[df_2007['continent']==cat]['lifeExp'], box_visible=True,
meanline_visible=True, opacity=0.6,
name = cat,
text = df_2007[df_2007['continent']==cat]['country'],
points='all'))
fig.update_layout(yaxis_zeroline=False)
fig.show()
おわりに
ここまでViolin plot の描き方・オプションを紹介してきましたが、今回の記事に収まらないほどさまざまなカスタマイズ方法があるので、改めてそちらもまとめてみたいと思います!
コメント