seabornmatplotlibをベースにしたデータビジュアライゼーションライブラリです。barplot は、データの大小が、棒の高低で表されるので、データの大小を比較するのに適しています。

前回は基本seaborn barplot の棒グラフに平均値のannotationをつけるで各々のbar(棒)の値をannotationの方法について解説しました。 今回は、比較対象の各々 barを隣接させ、より大小比較を際立たせるグラフの作成を紹介します。また、Y軸をパーセント(%)表示にする方法もご紹介します。Excelの代わりにseanborn でサクサク、グラフ化の参考の第三弾になります。

サンプルデータセット

今回は、以下のようなマルチインデックスのデータセットを使ってグラフを作成したいと思います。4つの支部のそれぞれ令和3年度と4年度における達成率がデータとしてあります。支部名と年度名がラベルインデックスとして配置されて、各々の達成率がColumn で提供されています。

dataset_image

reset_index()でx軸、y軸をColumnに配置する

seabornbarplotを利用するためには、x軸、y軸ともデータフレームのcolumn で指定するところは同じです。 しかし、groupby で集約したカテゴリカルデータのcolumn は、集約化されたデータフレームではラベルインデックスとして配置されています。 従って、reset_index()で二つのインデックスを両方ともcolumnに再配置させます。結果のデータフレームを図示しておきます。

dataset_image

Python コードの紹介

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import numpy as np
import pandas as pd
import seaborn as sns
#matplotlibのグラフをRetinaの高解像度で表示する
%config InlineBackend.figure_formats = {'png', 'retina'}
#Jupyter Notebookの中で作図した画像を表示させる
%matplotlib inline
#matplotlib をインポートする
import matplotlib.pyplot as plt

#X軸の並びを指定する
order = ['首都圏支部','愛知支部', '大阪支部', '福岡支部']

title = '主要支部達成率 前年度 vs 本年度 4~5月'
x_label = '支部名'
y_label = '率(%)'

ax = plt.subplots(figsize =(9,9))

ax = sns.barplot(x="支部名",
           y="達成率",
           hue="年度",
           data=df,
           order = order)

#グラフのタイトル等の属性情報を指定する
plt.title(title, fontsize=18, fontweight='bold' )
plt.xticks(rotation=0)
plt.xlabel(x_label, fontsize = 14, fontweight='bold')
plt.ylabel(y_label, fontsize = 14, fontweight='bold')

#y軸を%表示にする
import matplotlib.ticker as mtick
ax.yaxis.set_major_formatter(mtick.PercentFormatter(xmax=1, decimals=None, symbol='%', is_latex=False))

#各barにannotation(xx%)を追加する 
for p in ax.patches:
    ax.annotate(format(p.get_height(), '.2%'), 
                   (p.get_x() + p.get_width() / 2., 
                    p.get_height()), 
                    ha = 'center', 
                    va = 'center', 
                    xytext = (0, 9), 
                    textcoords = 'offset points',
                    fontsize = 12,
                    color = 'blue')

小数点何位までの表示とするかの指定

割合の表記で重要な点は0.xxx で操作はするけども、表記の際はxx.x% のようにパーセント表示にします。 以下のformat( '.2%')の部分がそれに相当します。

format(p.get_height(), '.2%')
値pをパーセント表示して小数点以下何位まで表記かを指定する .2f = パーセント表示で小数点第二位

Y軸も%表示にする

Annotation の数値を%表示にしたのですから、Y軸も%表示にした方が丁寧なグラフになることは言うまでもありません。これは、以下のTwo Line で実現できます。 このまま、コピペで使えます。 

1
2
import matplotlib.ticker as mtick
ax.yaxis.set_major_formatter(mtick.PercentFormatter(xmax=1, decimals=None, symbol='%', is_latex=False))

度数分布図、任意のカテゴリー順

order = ['首都圏支部','愛知支部', '大阪支部', '福岡支部']として order = orderとすると、orderで指定した順に棒グラフが並ぶことは前回説明しました。イメージは以下のとおりです。

隣接棒グラフ


参照ページ一覧

本ブログは、以下のネットの記事等を参考に作成しました。 

1) seaborn countplot の棒グラフに度数のannotationをつける
2) seaborn barplot の棒グラフに平均値のannotationをつける
3) seaborn
4) matplotlib
5) EXCELの達人からPythonの達人へ:住民基本台帳年齢階級別人口から都道府県別人口を作成する
6) 日本語対応した matplotlib 2軸グラフ