【Python】CSVファイルから積み上げ棒グラフを作成し、x軸を表にする

■概要

以下の実装をpythonを使用して行う。

  • csvファイルからデータを読み込む。
  • 棒グラフを作成する。(各データを色分けして累積)
  • 棒グラフのx軸はcsvデータを表にしたものとする。
A
A
B
B
C
C
30
30
10
10
10
10
40
40
30
30
50
50
20
20
40
40
10
10
Text is not SVG – cannot display

■フローチャート

本処理のフローチャートを以下に示す。

開始
開始
csvファイル読み込み
csvファイル読み込み
行列を取得
行列を取得
データ部を格納
データ部を格納
グラフのカラーマップ設定
グラフのカラーマップ設定
データ部の行数取得
データ部の行数取得
グラフのレイアウト設定
グラフのレイアウト設定
データ部の行数分繰り返し
データ部の行数分繰り返し
棒グラフのプロット
棒グラフのプロット
表のラベルセット
表のラベルセット
x軸に表を追加
x軸に表を追加
グラフの表示
グラフの表示
終了
終了
data.csv
data.csv
Text is not SVG – cannot display

■サンプルコード

本処理に使用するモジュールとcsvファイルを以下に示す。

・モジュール

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd


# 先頭列をインデックスとしてCSV読み込み
input_data = pd.read_csv('data.csv', index_col=0)

# 行列を取得
year_rows       = list(input_data.index)
kind_columns    = list(input_data.columns)

# データ部を格納
datas = input_data.to_numpy()

# カラーマップの設定
colors = plt.cm.BuPu(np.linspace(0, 0.5, len(year_rows)))

# データ部の行数を取得
n_rows = len(datas)

# グラフのインデックスと幅を設定
index = np.arange(len(kind_columns)) + 0.3
bar_width = 0.4

# 積み上げ棒グラフの垂直オフセットを初期化
y_offset = np.zeros(len(kind_columns))

# 棒グラフをプロットし、表のテキストラベルを作成する
cell_text = []
for row in range(n_rows):
    plt.bar(index,
        datas[row],
        bar_width,
        bottom=y_offset,
        color=colors[row])
    y_offset = y_offset + datas[row]
    cell_text.append([x for x in datas[row]])

# 色とテキストラベルを反転(降順)
cell_text.reverse()
year_rows.reverse()
colors = colors[::-1]

# x軸に表を追加
plt.table(cellText=cell_text,
    rowLabels=year_rows,
    rowColours=colors,
    colLabels=kind_columns,
    loc='bottom')

# 表のスペースを確保
plt.subplots_adjust(left=0.2, bottom=0.2)

# y軸ラベルの設定
plt.ylabel("amount")

# x軸のメモリ設定をなしにする
plt.xticks([])

# グラフと表の表示
plt.show()

・csvファイル(data.csv)

year,A,B,C,D
2020,10,12,15,18
2021,20,27,26,25
2022,30,31,39,35
2023,40,45,40,41

■実行結果

実行結果を以下に示す。

■参考

本処理を作成するにあたり、参考とさせていただいたURLを以下に示す。

タイトルとURLをコピーしました