seabornはmatplotlibをベースにしたデータビジュアライゼーションライブラリです。barplot は、データの大小が、棒の高低で表されるので、データの大小を比較するのに適しています。
前回は基本seaborn barplot の棒グラフに平均値のannotationをつけるで各々のbar(棒)
の値をannotation
の方法について解説しました。 今回は、比較対象の各々 bar
を隣接させ、より大小比較を際立たせるグラフの作成を紹介します。また、Y軸をパーセント(%)表示にする方法もご紹介します。Excelの代わりにseanborn でサクサク、グラフ化の参考の第三弾になります。
サンプルデータセット
今回は、以下のようなマルチインデックスのデータセットを使ってグラフを作成したいと思います。4つの支部のそれぞれ令和3年度と4年度における達成率がデータとしてあります。支部名と年度名がラベルインデックスとして配置されて、各々の達成率がColumn で提供されています。
reset_index()でx軸、y軸をColumnに配置する
seaborn
の barplot
を利用するためには、x軸、y軸ともデータフレームのcolumn で指定するところは同じです。 しかし、groupby
で集約したカテゴリカルデータのcolumn
は、集約化されたデータフレームではラベルインデックスとして配置されています。 従って、reset_index()
で二つのインデックスを両方ともcolumn
に再配置させます。結果のデータフレームを図示しておきます。
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軸グラフ