matplotlibで積み上げ棒グラフを作成するPythonスクリプトを紹介します。このスクリプトには積み上げ棒グラフに関係する設定項目を全て詰め込みました。不要な設定は変更または削除してご利用ください。
目次
スクリプト全文
import datetime import matplotlib.pyplot as plt import japanize_matplotlib def generate_stacked_bar_plot_sample(): """ matplotlibで積み上げ棒グラフを生成するサンプル。 備忘録として、主要な設定項目を全て活用する。 pyplotではなくAxesを使用する。 """ # 可視化するデータのサンプル # 品目 items = [ "りんご", "バナナ", "キウイ" ] # 売上 sales = [ [213, 293, 242, 234], # りんご [291, 272, 311, 298], # バナナ [178, 142, 113, 89], # キウイ ] # 棒の色 colors = [ "#FF5511FF", "#EECC00FF", "#00DD33FF" ] # 年月日 dates = [ datetime.datetime(year=2021, month=10, day=1), datetime.datetime(year=2021, month=11, day=1), datetime.datetime(year=2021, month=12, day=1), datetime.datetime(year=2022, month=1, day=1) ] # FigureおよびAxesの生成 fig, ax = plt.subplots( facecolor="#FFFFFFFF", # 背景色 figsize=(10, 6), # 画像のサイズ ) # 描画 bottom = [0 for _ in range(len(dates))] for i in range(len(colors)): ax.bar( x=dates, # 棒のラベルのリスト height=sales[i], # 棒の高さのリスト bottom=bottom, width=5, # 棒の太さ(デフォルト0.8) align="center", # 目盛ラベルと棒の横位置 color=colors[i], # 棒の色 linewidth=0, # 棒の枠線の太さ edgecolor="#000000FF", # 棒の枠線の色(太さ0では無関係) label=items[i], # 棒の名称 ) # マーカーの上に値を書き込み for j in range(len(sales[i])): x = dates[j] y = bottom[j] + sales[i][j] / 2 ax.annotate( text=sales[i][j], # 書き込む値 xy=(x, y), # 位置 xytext=(0, 0), # オフセット textcoords="offset points", ha='center', va='center', fontsize=10, # フォントサイズ color="#505050FF", # 文字色 ) for j in range(len(sales[i])): bottom[j] += sales[i][j] # グラフ領域の背景色を設定 ax.set_facecolor( color="#F0F0F0FF", # 背景色 ) # グラフのタイトルを設定 ax.set_title( label="果物の売上", # 文字列 fontsize=20, # フォントサイズ color="#505050FF", # 文字色 ) # 横軸のラベルを設定 ax.set_xlabel( xlabel="年月", # 横軸の文字列 fontsize=14, # フォントサイズ color="#505050FF", # 文字色 rotation=0, # ラベルの回転角度 ) # 縦軸のラベルを設定 ax.set_ylabel( ylabel="売上 [袋]", # 縦軸の文字列 fontsize=14, # フォントサイズ color="#505050FF", # 文字色 rotation=90, # ラベルの回転角度 ) # 横軸の目盛ラベルのパラメータを設定 ax.tick_params( axis="x", # パラメータを変更する軸 rotation=45, # ラベルの回転角度 labelcolor="#505050FF", # 文字色 ) # 縦軸の目盛ラベルのパラメータを設定 ax.tick_params( axis="y", # パラメータを変更する軸 labelcolor="#505050FF", # 文字色 ) # 縦軸の範囲を指定 ax.set_ylim( bottom=50, # 下限 top=750, # 上限 ) # 縦軸のスケールを指定 ax.set_yscale( value="linear", # 対数グラフなら"log"を指定 ) # 横軸の目盛間隔を設定 ax.set_xticks( ticks=dates, # 間隔 labels=[f"{d.year}年{d.month}月" for d in dates], # ラベル minor=False, # 補助目盛か? ) # 縦軸の目盛間隔を設定 ax.set_yticks( ticks=[y for y in range(100, 750, 100)], # 間隔 labels=[f"{y}袋" for y in range(100, 750, 100)], # ラベル minor=False, # 補助目盛か? ) ax.set_yticks( ticks=[y for y in range(50, 750, 50)], # 間隔 minor=True, # 補助目盛か? ) # 横軸の目盛を設定 ax.grid( axis="x", # 目盛を指定する軸 which="major", # 主目盛か補助目盛か visible=True, # 表示状態 color="#B0B0B0FF", # 目盛線の色 alpha=0.8, # 不透明度 linestyle="solid", # 線の種類 linewidth=1, # 線の太さ ) # 縦軸の目盛を設定 ax.grid( axis="y", # 目盛を指定する軸 which="major", # 主目盛か補助目盛か visible=True, # 表示状態 color="#B0B0B0FF", # 目盛線の色 alpha=0.8, # 不透明度 linestyle="solid", # 線の種類 linewidth=1, # 線の太さ ) # 縦軸の補助目盛を設定 ax.grid( axis="y", # 目盛を指定する軸 which="minor", # 主目盛か補助目盛か visible=True, # 表示状態 color="#B0B0B0FF", # 目盛線の色 alpha=0.8, # 不透明度 linestyle="dashed", # 線の種類 linewidth=0.5, # 線の太さ ) # 凡例の設定 ax.legend( bbox_to_anchor=(1, 1, 0, 0), # 凡例を配置する範囲のbbox loc="upper left", # bboxのどこに凡例を置くか borderaxespad=0.5, # 凡例とbboxの隙間 fontsize=12, # フォントサイズ labelcolor="#505050FF", # 文字色 ) # Axesの位置を調整 # 凡例を外に置いた場合や、横軸の目盛を回転させた場合、 # 調整しないとはみ出すことがある。 ax.set_position([0.1, 0.2, 0.75, 0.7]) # グラフをファイルに保存 fig.savefig("fruits_stacked.png") return fig, ax fig, ax = generate_stacked_bar_plot_sample()
出力結果
上記のスクリプトを実行すると以下の積み上げ棒グラフが出力されます。
終わりに
matplotlibには同じ結果を出力する方法が複数存在し、それらは複数のWebサイトでバラバラに紹介されています。所望のグラフを作成するためには、使い方を何度も検索する必要があります。そのような手間を削減するために、この記事では積み上げ棒グラフに必要そうな設定を一つのコードにまとめました。
なお、著者は以下のバージョンのライブラリで実行を確認しました。
- matplotlib==3.5.1
- japanize_matplotlib==1.1.3