Matplotlib Violin Plot – チュートリアルと実例集

Python には多くのデータ可視化ライブラリがありますが、Matplotlib はその中でも最も人気のあるライブラリです。Matplotlib の人気の理由はその信頼性と実用性にあり、少ないコードでシンプルなプロットから複雑なプロットまで作成することができます。また、プロットは様々な方法でカスタマイズすることができます。

このチュートリアルでは、Matplotlib で Violin Plots をプロットする方法について説明します。

バイオリンプロットは、データの分布を可視化するために使用され、データの範囲、中央値、分布を表示します。

バイオリンプロットは箱ひげ図と同じ要約統計量を表示しますが、データの形状/分布を表現するカーネル密度推定も含まれます。

データのインポート

Violinのプロットを作成する前に、プロットするためのデータが必要です。ここでは、Gapminderデータセットを使用します。

まず、PandasとMatplotlibを含む必要なライブラリーをインポートすることから始めます。

import pandas as pd
import matplotlib.pyplot as plt


データが正しく読み込まれたことを確認するために、データエントリーに欠落がないことを確認し、データセットの先頭をプリントアウトします。エンコーディングの種類を必ず ISO-8859-1 に設定してください。

dataframe = pd.read_csv("gapminder_full.csv", error_bad_lines=False, encoding="ISO-8859-1")
print(dataframe.head())
print(dataframe.isnull().values.any())


       country  year  population continent  life_exp     gdp_cap
0  Afghanistan  1952     8425333      Asia    28.801  779.445314
1  Afghanistan  1957     9240934      Asia    30.332  820.853030
2  Afghanistan  1962    10267083      Asia    31.997  853.100710
3  Afghanistan  1967    11537966      Asia    34.020  836.197138
4  Afghanistan  1972    13079460      Asia    36.088  739.981106


Matplotlib でのバイオリンプロットの描画

Matplotlib で Violin Plot を作成するには、 Axes インスタンス、または PyPlot インスタンス自身に対して、 violinplot() 関数を呼び出します。

import pandas as pd
import matplotlib.pyplot as plt


dataframe = pd.read_csv("gapminder_full.csv", error_bad_lines=False, encoding="ISO-8859-1")


population = dataframe.population
life_exp = dataframe.life_exp
gdp_cap = dataframe.gdp_cap


# Extract Figure and Axes instance
fig, ax = plt.subplots()


# Create a plot
ax.violinplot([population, life_exp, gdp_cap])


# Add title
ax.set_title('Violin Plot')
plt.show()


最初のプロットを作成すると、データの分布を見ることができますが、いくつかの問題にも気がつくでしょう。特徴のスケールが非常に異なるため、平均寿命とGDPの列の分布を見ることは実質的に不可能です。

このため、それぞれの列をそれ自身のサブプロットにプロットしたいと思います。

データセットの列を比較しやすくするために、データフレームを少しソートしてスライスしてみます。データフレームを「国」でグループ化し、それぞれの国の最新/最後のエントリだけを選択します。

次に、人口でソートし、最大の人口を持つエントリ(大きな人口の外れ値)を削除します。そうすることで、データフレームの残りの部分がより似た範囲になり、比較が簡単になります。

dataframe = dataframe.groupby("country").last()
dataframe = dataframe.sort_values(by=["population"], ascending=False)
dataframe = dataframe.iloc[10:]
print(dataframe)


これで、データフレームは次のようになります。

コード偽

素晴らしい では、subplots()関数で図と3つの軸のオブジェクトを作成しましょう。これらの軸はそれぞれバイオリンプロットを持つことになります。今はもっと扱いやすいスケールで作業しているので、 showmedians 引数を True に設定してオンにもしてみましょう。

これにより、バイオリンプロットの中央部に水平線が表示されます。

                       year  population continent  life_exp       gdp_cap
country
Philippines            2007    91077287      Asia    71.688   3190.481016
Vietnam                2007    85262356      Asia    74.249   2441.576404
Germany                2007    82400996    Europe    79.406  32170.374420
Egypt                  2007    80264543    Africa    71.338   5581.180998
Ethiopia               2007    76511887    Africa    52.947    690.805576
...                     ...         ...       ...       ...           ...
Montenegro             2007      684736    Europe    74.543   9253.896111
Equatorial Guinea      2007      551201    Africa    51.579  12154.089750
Djibouti               2007      496374    Africa    54.791   2082.481567
Iceland                2007      301931    Europe    81.757  36180.789190
Sao Tome and Principe  2007      199579    Africa    65.528   1598.435089


このコードを実行すると、次のような結果が得られます。

これでデータの分布がよくわかるようになりました。バイオリンの中央の水平線がデータの中央値で、最小値と最大値はY軸の線の位置で示されます。

Matplotlib で Violin Plot をカスタマイズする

さて、Violin Plots をカスタマイズする方法を見てみましょう。

XとYの刻みを加える

ご覧のように、プロットはうまく生成されましたが、X軸とY軸に目盛りラベルがないと、グラフを解釈するのが難しくなります。人間は、数値よりもカテゴリー値を簡単に解釈します。

set_xticks()`関数を使って、プロットをカスタマイズし、X軸にラベルを追加することができます。

# Create figure with three axes
fig, (ax1, ax2, ax3) = plt.subplots(nrows=1, ncols=3)


# Plot violin plot on axes 1
ax1.violinplot(dataframe.population, showmedians=True)
ax1.set_title('Population')


# Plot violin plot on axes 2
ax2.violinplot(life_exp, showmedians=True)
ax2.set_title('Life Expectancy')


# Plot violin plot on axes 3
ax3.violinplot(gdp_cap, showmedians=True)
ax3.set_title('GDP Per Cap')


plt.show()


この結果は

ここでは、X軸の刻み目を範囲から中央の1つに設定し、解釈しやすいラベルを追加しています。

Matplotlib での水平方向のバイオリンプロットの描画

もし望むなら、 vert パラメータを変更することによって、プロットの方向を変えることもできます。vertは、プロットが垂直にレンダリングされるかどうかを制御し、デフォルトではTrue` に設定されています。

fig, ax = plt.subplots()
ax.violinplot(gdp_cap, showmedians=True)
ax.set_title('violin plot')
ax.set_xticks([1])
ax.set_xticklabels(["Country GDP",])
plt.show()


ここでは、X 軸の代わりに Y 軸の目盛りラベルとその頻度を設定しました。また、ラベルを90度回転させています。

データセットの平均値をバイオリンプロットで表示する。

他にもいくつかのカスタマイズパラメータがあります。showmean` パラメータを使用すると、中央値に加えて平均値を表示することができます。

それでは、中央値に加えて平均値を表示してみましょう。

fig, ax = plt.subplots()
ax.violinplot(gdp_cap, showmedians=True, vert=False)
ax.set_title('violin plot')
ax.set_yticks([1])
ax.set_yticklabels(["Country GDP",])
ax.tick_params(axis='y', labelrotation = 90)
plt.show()


ただし、中央値と平均値は基本的に同じように見えるので、ここでどの縦線が中央値で、どの縦線が平均値なのかがわからなくなる可能性があることに注意してください。

バイオリンプロットに対するカーネル密度推定のカスタマイズ

W

結論

このチュートリアルでは、MatplotlibとPythonを使ってViolin Plotをプロットするいくつかの方法について説明しました。また、XとYの目盛りを追加したり、水平にプロットしたり、データセットの平均を表示したり、KDEのポイントサンプリングを変更したりして、それらをカスタマイズする方法についても説明しました。

もしあなたがデータ可視化に興味があり、何から始めたらいいかわからない場合は、Pythonでデータ可視化に関する書籍の束をチェックしてみてください。

Pythonによるデータ可視化

データビジュアライゼーションで危険な存在になる

30日間無条件返金保証

初級から上級まで

定期的に無料で更新(最新更新は2021年4月)

ボーナスリソースやガイドを更新

Pythonでデータ可視化 MatplotlibとPandasは、Pythonの基礎知識を持つ全くの初心者が、PandasとMatplotlibを使って、単純なプロットからインタラクティブなボタンを持つアニメーションの3Dプロットまで、これらのライブラリで高度な作業をするための強力な基盤を構築できるように設計された書籍です。

本書は、Pythonの基本的な知識を持つ方を対象としています。
PandasとMatplotlibについて知っておく必要
があることすべてを教えてくれる、詳細なガイドです。

Pythonによるデータ可視化」は、Pythonの初級~中級開発者向けの書籍で、Pandasを使った簡単なデータ操作から、MatplotlibやSeabornなどのコアなプロットライブラリを取り上げ、Altairなどの宣言型ライブラリや実験的ライブラリを活用する方法について案内しています。具体的には、11章にわたって、9つのPythonライブラリを取り上げています。Pandas、Matplotlib、Seaborn、Bokeh、Altair、Plotly、GGPlot、GeoPandas、そしてVisPyです。

データビジュアライゼーションのユニークで実用的なガイドとして、あなたがキャリアで使うかもしれない多くのツールを紹介しています。

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