解析エンジニアの自動化 blog

コツコツと自動化した方法を残す blog

Python で棒グラフを描く



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。


この記事の目次



背景・目的


Python で分析を始めたいと思ってグラフの描き方を調べ出しました。

今回は棒グラフの描き方をまとめました。



動作環境


Windows 7
・winpython 64bit 3.4.4



プログラム

ソースコード


###############################################################################
# 棒グラフを作成するプログラム
###############################################################################
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
 
# グラフの値の準備 ---------------------------------------------------------------
sample_label = ["a", "b", "c", "d", "e", "f", "g"]
np.random.seed(seed=42)
sample_data = np.random.randint(0, 180, size=7)
 
# グラフの値の整形 ---------------------------------------------------------------
sample_df = pd.DataFrame({"label": sample_label, "data":sample_data}, columns=["label", "data"])
 
# グラフの値のソート ---------------------------------------------------------------
sample_df = sample_df.sort_values(by="data", ascending=False)
 
# グラフの値を項目毎に加算する -----------------------------------------------------
sample_df["accum"] = np.cumsum(sample_df["data"])
 
# 全体に対する項目の割合を計算する -------------------------------------------------
sample_df["accum_percent"] = sample_df["accum"] / sum(sample_df["data"]) * 100
 
# 全体に対する項目の割合を計算する -------------------------------------------------
fig, ax1 = plt.subplots(figsize=(6,4))
 
# データ数のカウント----------------------------------------------------------------
data_num = len(sample_df)
 
# 棒グラフの棒の設定--------------------------------------------------------------
bar = 2 # 1:棒グラフの棒幅が広い 2:棒グラフの棒幅が狭い
if bar == 1:
    ax1.bar(range(1, data_num + 1), sample_df["data"], align="edge", width=-1, edgecolor='k')
    ax1.set_xticks([0.5 + i for i in range(data_num)], minor=True)
else:
    ax1.bar(range(1, data_num + 1), sample_df["data"], width=-0.5, edgecolor='k')
    ax1.set_xticks([1 + i for i in range(data_num)], minor=True)
 
# 自動で割り当てられる横軸ラベルを消去------------------------------------------------
ax1.set_xticklabels([])
 
# 横軸ラベルに "label" を設定-----------------------------------------------------
ax1.set_xticklabels(sample_df["label"].tolist(), minor=True)
 
# 横軸に名前をつける
ax1.set_xlabel("label")
 
# 縦軸に名前をつける
ax1.set_ylabel("counts")
 
# グラフの保存 -------------------------------------------------------------------
plt.savefig("C:\\WinPython-64bit-3.4.4.6Qt5\\settings\\.spyder-py3\\Bar_Graph.jpg", bbox_inches="tight")



結果

データはシード値を固定した乱数です。

棒グラフはデータが大きい順に左から並べ替えられています。

図2 棒グラフ



コメント

この棒グラフはランキングを整理する場合は良さそうですね。



以上