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