matplotlibで円グラフを描く

 

matplotlibを使って円グラフを描いてみたのでそのメモ。

円グラフの使い方についていろいろ書いてみます。

 

 

ライブラリのインポート

今回使うライブラリです。

import matplotlib.pyplot as plt
import seaborn as sns

Jupyter Notebookからではなくコマンドプロンプトからプログラムを実行します。

データの用意

seabornで最初から用意されているタイタニック号のデータセットを使います。

そこから年齢のみを取り出して年代別に分けていきます。

def get_labels(x):
    if x < 10.0:
        return 0
    elif x < 20.0:
        return 1
    elif x < 30.0:
        return 2
    elif x < 40.0:
        return 3
    elif x < 50.0:
        return 4
    elif x < 60.0:
        return 5
    elif x < 70.0:
        return 6
    elif x < 80.0:
        return 7
    elif x < 90.0:
        return 8
    else:
        return 9

# データセットの型はpandasのDataFrame
df = sns.load_dataset('titanic')
age = df['age']
age = age.dropna()
age_list = [0] * 10
for x in age.values:
    age_list[get_labels(x)] += 1

age_listにはタイタニック号に乗船した人たちの年代別の数が入っています。

これからこのデータを円グラフにしてみます。

円グラフを描く

円グラフを描くにはpie()を使います。

matplotlib.pyplot.pie(x, *kwargs)

円グラフのスタイルのカスタマイズをしたい場合は引数にデータを渡して設定をします。

まずは、試しに円グラフを描いてみます。

plt.pie(age_list)
plt.show()

 

こんな感じの円グラフが表示されます。

f:id:pytry3g:20180820135550p:plain

これではどのデータがどの色なのか分からないのでラベルを付けてみます。

ラベルの表示

age_listには10歳未満、10代、20代の順に乗船者の数が年代別に分かれて入っています。

そのため、ラベルの中身は年代別の順番通りに下のようなリストを用意しました。

labels = ["10歳未満", "10代", "20代", "30代", "40代", "50代", "60代", "70代", "80代", "その他"]

 

今度はラベル付きで円グラフを描いてみます。

plt.pie(age_list, labels=labels)
plt.show()

引数のlabelsにラベルのリストを渡してプログラムを実行します。

f:id:pytry3g:20180820140730p:plain

ラベル付きで表示されました。

この円グラフからタイタニック号に乗船した人は20代が最も多いことがわかりますね。しかし、よく見ると70代と80代とその他がかぶっています。

見えるように要素をずらしてみます。

要素をずらす

引数のひとつexplodeを以下のようにしてみると、特定の要素を目立たせて表示させることができます。

plt.pie(
    age_list,
    labels=labels,
    explode=[0, 0, 0, 0, 0, 0, 0, 0.1, 0.2, 0.3]
)
plt.show()

これで円グラフこのようになりました。

f:id:pytry3g:20180820143352p:plain

相変わらずわかりにくいので20代のほうを目立たせてみます。

plt.pie(
    age_list,
    labels=labels,
    explode=[0, 0, 0.3, 0, 0, 0, 0, 0, 0, 0]
)
plt.show()

 

20代のみを30%ずらして表示させた結果がこちら。↓↓↓

f:id:pytry3g:20180820143728p:plain

色の設定

引数のひとつcolorsに色の名前が入ったリストを渡すことにより要素の色を指定することができます。

Alias Color
'b' blue
'g' green
'r' red
'c' cyan
'm' magenta
'y' yellow
'k' black
'w' white

 

colors = ['b', 'g', 'r', 'c', 'm', 'y', 'k', 'w', 'burlywood','chartreuse']
plt.pie(
    age_list,
    labels=labels,
    colors=colors
)
plt.show()

色を指定して円グラフを表示すると、

f:id:pytry3g:20180820145309p:plain

が表示される。

枠線の設定をしてみる

wedgepropslinewidthで枠線の太さedgecolorで枠線のを設定できる。

plt.pie(
    age_list,
    labels=labels,
    colors=colors,
    wedgeprops={'linewidth': 3, 'edgecolor': 'w'}
)
plt.show()

f:id:pytry3g:20180820154701p:plain

ここにきて気づいたことが一つある。さっきから表示してるグラフって円グラフじゃなくて楕円の形をしたグラフになっていることに、、、

楕円を真円になおす

plt.axis("equal")を入れることにより楕円を真円になおすことができる。

plt.pie(
    age_list,
    labels=labels,
    colors=colors,
    wedgeprops={'linewidth': 3, 'edgecolor': 'w'}
)
plt.axis('equal')
plt.show()

f:id:pytry3g:20180820155346p:plain

円になった(^^

最後に各年代にそれぞれ何人くらいいるのかをグラフに表示させて終わりにする。

要素の割合を表示させる。

引数autopctを使って要素の割合をパーセンテージ表示させます。

plt.pie(
    age_list,
    labels=labels,
    colors=colors,
    autopct="%.1f%%"
)
plt.axis('equal')
plt.show()

f:id:pytry3g:20180820160659p:plain

 やっぱり20代が約三割いるので一番多いですね。

 

ここまでmatplotlibを使った円グラフのいろいろな表示方法について簡単に書いてみました。まだまだ紹介できていなことがありますが、とりあえず今回はここまでにします。

おまけ(seabornで円グラフを描く)

seabornには円グラフが用意されていないのでmatplotlibの円グラフを利用してseabornのスタイルで円グラフを表示させる必要があります。

seabornのスタイルを適用するにはset()を使います。

sns.set()

set()を使うとseabornのデフォルトのスタイルが適用されてグラフが表示されます。今回は文字化けを防ぐために以下のようにします。 

sns.set(font="IPAexGothic")

このコードはライブラリのインポートした直後に書きます。

import matplotlib.pyplot as plt
import seaborn as sns
sns.set(font="IPAexGothic")

Q&A

文字化けについて

matplotlibやseabornで日本語を表示しようとすると文字化けで表示されるかもしれません。そんなときは、以下の方法を試してみてください。

matplotlibの対策

こちらの記事の説明に従って進めれば文字化けは解消されます。

これでちゃんと日本語が表示されるはずですが、もしかしたら表示されないかもしれません。私がそうでした。

そこで色々と調べて、やってみた結果無事日本語が表示されました。

私がやったことは以下の2点です。

  • パソコンの再起動
  • matplotlibの再インストール

もしかすると別なことをやって文字化けが解消されたのかもしれませんが、よくわかりません。

seabornの対策

matplotlibの対策をしていない場合は先にそっちの対策をしてください。

こちらの記事を参考にすれば文字化けは解消されるはずです。