Pythonでグラフを描画するとどうしてももう少し綺麗にならないかなと常々考えていました。
seabornという優秀なライブラリを使えば、見た目が綺麗なグラフを作成できますが、Excelと比べてしまうとどうしても違和感がありました。
なので、なるべくExcelみたいに描画することが出来ないか試していたことがあるのでまとめてみました。
今回は分析でよく作成していた、棒グラフと折れ線グラフの二軸グラフをExcelで描画したときみたいな見た目になるように作成してみました。
個人的にはここまでできればひとまず違和感はあまりないかという印象です。
構成比(棒)・累積構成比(折れ線)の二軸グラフをPythonで描く
# 必要なライブラリの読み込み
import pandas as pd
import seaborn as sns
# 描画設定
sns.set_style("whitegrid")
from matplotlib import rcParams
rcParams['font.family'] = 'Hiragino Sans' # Macの場合
#rcParams['font.family'] = 'Meiryo' # Windowsの場合
#rcParams['font.family'] = 'VL PGothic' # Linuxの場合
rcParams['xtick.labelsize'] = 12 # x軸のラベルのフォントサイズ
rcParams['ytick.labelsize'] = 12 # y軸のラベルのフォントサイズ
rcParams['axes.labelsize'] = 18 # ラベルのフォントサイズ
rcParams['figure.figsize'] = 18,8 # 画像サイズの変更(inch)
テストデータの作成
# 例えば販売住宅の支払い済みローン割合のデータを集計したいと仮定
# 下記サンプルデータだと、総住宅ローンのうち、40%-60%支払っている住宅が600物件ある
d = {'区分': ['01_0%', '02_00%-20%', '03_20%-40%','04_40%-60%','05_60%-80%', '06_80%-100%'],
'販売済み住宅数': [100,300,600,700,200,50]
}
# DataFrameを作成
df = pd.DataFrame(data=d)
df
Out[0]
区分 販売済み住宅数 0 01_0% 100 1 02_00%-20% 300 2 03_20%-40% 600 3 04_40%-60% 700 4 05_60%-80% 200 5 06_80%-100% 50
# 構成比カラムの作成
df["構成比"] = df["販売済み住宅数"] / df["販売済み住宅数"].sum()
df
Out[0]
区分 販売済み住宅数 構成比 0 01_0% 100 0.051282 1 02_00%-20% 300 0.153846 2 03_20%-40% 600 0.307692 3 04_40%-60% 700 0.358974 4 05_60%-80% 200 0.102564 5 06_80%-100% 50 0.025641
# 累積構成比カラムの作成
df["累積構成比"] = df["構成比"].cumsum() / df["構成比"].sum()
df
Out[0]
区分 販売済み住宅数 構成比 累積構成比 0 01_0% 100 0.051282 0.051282 1 02_00%-20% 300 0.153846 0.205128 2 03_20%-40% 600 0.307692 0.512821 3 04_40%-60% 700 0.358974 0.871795 4 05_60%-80% 200 0.102564 0.974359 5 06_80%-100% 50 0.025641 1.000000
グラフの描画
import matplotlib.pyplot as plt
from matplotlib import ticker
plt.figure()
plt.title("販売済み住宅の支払い済みローン金額の割合")
g = sns.barplot(x="区分",y="販売済み住宅数",color="#4F81BD",data=df)
g2 = g.twinx() # 第2軸をgに追加
g2 = sns.lineplot(x="区分",y="累積構成比",color="#C0504D",markers=True,dashes=False,data=df)
g2.grid(visible=False) # 第2Y軸のグリッドをOFFにする
g2.yaxis.set_major_locator(ticker.MultipleLocator(0.1)) # 第2Y軸を0.1刻みで表示する
g2.get_yaxis().set_major_formatter(ticker.PercentFormatter(xmax=1.0,decimals=None,symbol='%')) # 第2Y軸を%で表示するようにする
まとめ
いかがでしょうか?Excelみたいになりましたでしょうか?
今回は実数と累積構成比の二軸グラフを作成してみました。
次はExcelで数値列をグラフ化したときの図を描画してみたいと思います。
単純にPythonで描画するとX軸のラベルが多い場合は見た目が窮屈になりますが、Excelだと上手にデータを間引いて表示してくれているみたいです。
少し手がかかりますが、頑張って作成してみようと思います。