Matplotlib 棒グラフ入門:横棒・グループ化・積み上げまで解説【第3回】

Colab → WordPress HTML (Prism + Copy, Dark Theme)

棒グラフは、カテゴリごとの値を比較するのに便利な可視化手法です。本記事では、Matplotlibでの棒グラフ・横棒グラフの描き方、複数系列のグループ化、積み上げグラフの作成方法を、初心者でもすぐ実践できるサンプルコード付きで解説します。

この記事でわかること

  • Matplotlib を使用した棒グラフ(縦・横)の基本的な描き方
  • 複数系列のグループ化と積み上げ棒グラフ
  • 色・ラベル・凡例の設定方法
  • カテゴリラベルの回転・調整方法
  • 棒グラフのカスタマイズ方法(幅、色、枠線など)
  • データ可視化における棒グラフの活用例と注意点

▶️ 公式ドキュメントも参考にしてください:

1. 基本の棒グラフ



import pandas as pd
import matplotlib.pyplot as plt

!pip install japanize-matplotlib > /dev/null # Google Colab の機能を使って日本語フォントをインストール・インポート
import japanize_matplotlib

# データをDataFrameにする
date={"カテゴリ":["A", "B", "C", "D"], "値": [5, 7, 3, 4]}
df=pd.DataFrame(date)

fig, ax = plt.subplots()
ax.bar(df['カテゴリ'], df['値'], color="skyblue")
ax.set_title("基本の棒グラフ")
ax.set_xlabel("カテゴリ")
ax.set_ylabel("値")
plt.show()

figure

ここでは、基本的な縦棒グラフの描き方を紹介しています。

  • import pandas as pdimport matplotlib.pyplot as plt で、データ分析とグラフ描画に必要なライブラリをインポートしています。
  • !pip install japanize-matplotlib > /dev/null で日本語フォントを表示するためのライブラリをインストールしています。
  • import japanize_matplotlib でインストールしたライブラリをインポートしています。
  • date dateという名前の Python の辞書を作成し、その辞書を基に Pandas の DataFrame df を作成しています。pd.DataFrame(date) で Pandas の DataFrame に変換しています。
  • plt.subplots() で図と軸を作成します。
  • ax.bar(df["カテゴリ"], df["値"], color="skyblue") で縦棒グラフを描画しています。
  • * 第一引数にカテゴリのリスト、第二引数に値のリストを指定します。

    * color="skyblue" で棒の色を水色に設定しています。

  • ax.set_title(), ax.set_xlabel(), ax.set_ylabel() でグラフのタイトルと軸ラベルを設定しています。
  • plt.show() でグラフを表示しています。

2. 横棒グラフ

カテゴリが多い場合やラベルが長い場合は、横棒グラフ(barh)が見やすくなります。


# 既存のDataFrameを活用
# date={"カテゴリ":["A", "B", "C", "D"], "値": [5, 7, 3, 4]}
# df=pd.DataFrame(date)

fig, ax = plt.subplots()
ax.barh(df['カテゴリ'], df['値'], color="lightgreen")
ax.set_title("横棒グラフ")
ax.set_xlabel("値")
ax.set_ylabel("カテゴリ")
plt.show()

figure

ここでは、横棒グラフの描き方を紹介しています。横棒グラフは ax.barh() を使います。

  • ax.barh(df[“カテゴリ”], df[“値”], color="lightgreen") で横棒グラフを描画しています。
  • * bar() とは異なり、第一引数にカテゴリ、第二引数に値を指定します。

    * color="lightgreen" で棒の色を薄い緑色に設定しています。

  • 横棒グラフでは、X軸が値、Y軸がカテゴリになるため、ax.set_xlabel()ax.set_ylabel() で設定するラベルも縦棒グラフとは逆になります。

3. 複数系列のグループ化

カテゴリごとに複数の系列を並べて比較します。


# 既存のDataFrameを活用
# date={"カテゴリ":["A", "B", "C", "D"], "値": [5, 7, 3, 4]}
# df=pd.DataFrame(date)

# 新規のDataFrameを作成
date2={"カテゴリ":["A", "B", "C", "D"], "値":[6, 5, 4, 6]}
df2=pd.DataFrame(date2)

# Numpyのインストール
import numpy as np
x = np.arange(len(df2["カテゴリ"]))  # カテゴリ位置

width = 0.35  # 棒の幅

fig, ax = plt.subplots()
ax.bar(x - width/2, df["値"], width, label="data", color="skyblue")
ax.bar(x + width/2, df2["値"], width, label="data2", color="orange")

ax.set_xticks(x)
ax.set_xticklabels(df["カテゴリ"])
ax.set_title("複数系列のグループ化")
ax.legend()
plt.show()

figure

ここでは、複数の系列を並べて比較するグループ化された棒グラフの描き方を紹介しています。

  • date2 比較対象となる 2 つ目のデータセット(ここではPythonの辞書)を作成し、それをもとに df2 という名前のDataFrameを作成しています。
  • import numpy as np で、数値計算を行うための NumPy というライブラリをインポートしています。
  • x = np.arange(len(df2["カテゴリ"])) ここでは、グラフのX軸上で棒をどこに配置するかを決めるための準備をしています。具体的には、カテゴリの数(今回は4つ)と同じ数の連番(0, 1, 2, 3)を持つ配列を作成し、これを各カテゴリの「中心」となる位置と考えます。
  • width = 0.35 描画する棒1本1本の太さを決めています。ここでは0.35という値を設定しています。
  • ax.bar(x - width/2, df["値"], width, label="data", color="skyblue") これで1つ目のデータ系列(df)の棒グラフを描画します。
  • * x - width/2:上で決めたカテゴリの中心位置(x)から、棒の幅の半分だけ左にずらした位置を、この棒のX座標としています。こうすることで、後の棒と並べて表示できます。

    * df["値"]:棒の高さとして、dfの「値」のデータを使います。

    * width:棒の太さを指定しています。

    * label="data":この棒が何を表しているかを示す「凡例(はんれい)」の名前を「data」と設定しています。

    * color="skyblue":棒の色を水色に設定しています。

  • ax.bar(x + width/2, df2["値"], width, label="data2", color="orange") これで2つ目のデータ系列(df2)の棒グラフを描画します。
  • * x + width/2:カテゴリの中心位置(x)から、棒の幅の半分だけ右にずらした位置をX座標としています。これにより、1つ目の棒の右隣に並びます。

    * df2["値"]:棒の高さとして、df2の「値」のデータを使います。

    * width:棒の太さを指定しています。

    * label="data2":凡例の名前を「data2」と設定しています。

    * color="orange":棒の色をオレンジ色に設定しています。

  • ax.set_xticks(x) X軸に目盛りを表示する位置を、上で作成した配列 x の位置(0, 1, 2, 3)に設定しています。
  • ax.set_xticklabels(df["カテゴリ"]) X軸の目盛りのところに表示される文字を、カテゴリの名前(A, B, C, D)に設定しています。
  • ax.legend() グラフの右上に、どの色の棒が「data」で、どの色の棒が「data2」かを示す凡例を表示しています。

4. 積み上げ棒グラフ

カテゴリごとの合計値や構成割合を一つの棒グラフで表す場合に便利なのが積み上げ棒グラフです。ここでは、合計値を示す積み上げ棒グラフと構成割合を示す積み上げ棒グラフの描き方を紹介します。データ分析において、各要素の貢献度や全体像を把握するのに役立ちます。

4.1. 合計値を示す積み上げ棒グラフ

このセクションでは、各カテゴリにおける複数のデータ系列の合計値を視覚的に示す積み上げ棒グラフの作成方法を解説します。bottom 引数を使用して、前の系列の上に積み上げて表示します。


# 既存のDataFrameを活用
# date={"カテゴリ":["A", "B", "C", "D"], "値": [5, 7, 3, 4]}
# df=pd.DataFrame(date)

# date2={"カテゴリ":["A", "B", "C", "D"], "値":[6, 5, 4, 6]}
# df2=pd.DataFrame(date2)


fig, ax = plt.subplots()
ax.bar(df["カテゴリ"], df["値"], label="data", color="skyblue")
ax.bar(df2["カテゴリ"], df2["値"], bottom=df["値"], label="data2", color="orange")

ax.set_title("積み上げ棒グラフ")
ax.legend()
plt.show()

figure

ここでは、カテゴリごとの合計値や構成比を見るのに便利な積み上げ棒グラフの描き方を紹介しています。

  • ax.bar(df["カテゴリ"], df["値"], label="data", color="skyblue") でまず最初のデータ系列の棒グラフを描画します。これが積み上げの土台となります。
  • ax.bar(df2["カテゴリ"], df2["値"], bottom=df["値"], label="data2", color="orange") で2つ目のデータ系列の棒グラフを描画します。
  • * bottom=df["値"] とすることで、1つ目のデータ系列の棒グラフの高さの上に積み上げて描画されます。

  • ax.legend() で凡例を表示しています。

4.2. 構成割合を示す積み上げ棒グラフ

積み上げ棒グラフは、各カテゴリ内での要素の構成割合を視覚的に示すのにも適しています。ここでは、各カテゴリを100%として、各データ系列が占める割合を示す積み上げ棒グラフの描き方を紹介します。データ分析において、各要素の比率を比較するのに非常に有効です。


# 既存のDataFrameを活用
# date={"カテゴリ":["A", "B", "C", "D"], "値": [5, 7, 3, 4]}
# df=pd.DataFrame(date)

# date2={"カテゴリ":["A", "B", "C", "D"], "値":[6, 5, 4, 6]}
# df2=pd.DataFrame(date2)

# 構成割合を計算
df_total = df["値"] + df2["値"]
df_ratio = df["値"] / df_total
df2_ratio = df2["値"] / df_total

fig, ax = plt.subplots()

ax.bar(df["カテゴリ"], df_ratio, label="data", color="skyblue")
ax.bar(df2["カテゴリ"], df2_ratio, bottom=df_ratio, label="data2", color="orange")

ax.set_title("構成割合を示す積み上げ棒グラフ")
ax.set_ylabel("割合")
ax.legend()
plt.show()

figure

5. その他のカスタマイズと応用

棒グラフをより見やすく、目的に合わせてカスタマイズするための方法を紹介します。色や幅の調整、枠線の追加など、様々なカスタマイズが可能です。

5.1 カテゴリラベルの回転

カテゴリのラベルが長い場合、ラベルが重なって読みにくくなることがあります。plt.xticks(rotation=角度) を使用することで、カテゴリラベルを回転させて表示を改善できます。


# ラベルが長い場合のサンプルデータ
long_labels_date = {"カテゴリ": ["非常に長いカテゴリラベルA", "少し長いカテゴリラベルB", "カテゴリラベルC", "カテゴリラベルD"], "値": [5, 7, 3, 4]}
long_labels_df = pd.DataFrame(long_labels_date)

fig, ax = plt.subplots(figsize=(8, 5)) # 図のサイズを調整して見やすくする
ax.bar(long_labels_df["カテゴリ"], long_labels_df["値"], color="skyblue")
ax.set_title("カテゴリラベル回転前")
ax.set_xlabel("カテゴリ")
ax.set_ylabel("値")
plt.show()

fig, ax = plt.subplots(figsize=(8, 5)) # 図のサイズを調整して見やすくする
ax.bar(long_labels_df["カテゴリ"], long_labels_df["値"], color="skyblue")
ax.set_title("カテゴリラベル回転後 (45度)")
ax.set_xlabel("カテゴリ")
ax.set_ylabel("値")
plt.xticks(rotation=45, ha='right') # ラベルを45度回転させ、右端を基準に配置
plt.tight_layout() # ラベルが重ならないようにレイアウトを調整
plt.show()

figure

figure

5.2 グラフの枠線の追加

棒グラフに枠線を追加することで、個々の棒をより明確に区別し、視覚的な強調を加えることができます。edgecolorlinewidth 引数を使用して枠線の色と太さを設定します。


# 既存のDataFrameを活用
#date={"カテゴリ":["A", "B", "C", "D"], "値": [5, 7, 3, 4]}
#df=pd.DataFrame(date)


fig, ax = plt.subplots()
ax.bar(df["カテゴリ"], df["値"], color="skyblue", edgecolor="black", linewidth=1.5) # 枠線と太さを指定
ax.set_title("棒グラフの枠線カスタマイズ")
ax.set_xlabel("カテゴリ")
ax.set_ylabel("値")
plt.show()

figure

5.3 個別の棒の色を変える

棒グラフの個々の棒に異なる色を指定することで、特定のカテゴリを強調したり、視覚的なバリエーションを加えたりすることができます。color 引数に色のリストを指定します。


# 既存のDataFrameを活用
# date={"カテゴリ":["A", "B", "C", "D"], "値": [5, 7, 3, 4]}
# df=pd.DataFrame(date)

# 個別の棒の色を指定
colors = ["red", "blue", "green", "purple"]

fig, ax = plt.subplots()
ax.bar(df['カテゴリ'], df['値'], color=colors) # 色のリストをcolor引数に指定
ax.set_title("個別の棒の色を変える")
ax.set_xlabel("カテゴリ")
ax.set_ylabel("値")
plt.show()

figure

5.4 グラフにテキストラベルを追加

棒グラフの各棒の上に数値を直接表示することで、グラフを見る人が正確な値を素早く把握できるようになります。ax.text() 関数を使用してテキストラベルを追加します。


# 既存のDataFrameを活用
# date={"カテゴリ":["A", "B", "C", "D"], "値": [5, 7, 3, 4]}
# df=pd.DataFrame(date)


fig, ax = plt.subplots()
bars = ax.bar(df["カテゴリ"], df["値"], color="skyblue")
ax.set_title("棒グラフにテキストラベルを追加")
ax.set_xlabel("カテゴリ")
ax.set_ylabel("値")

# 棒の上に値を表示
for bar in bars:
    yval = bar.get_height()
    ax.text(bar.get_x() + bar.get_width()/2.0, yval, int(yval), va="bottom", ha="center") # テキストの位置と表示内容を設定

plt.show()

figure

ここでは、描画された棒グラフの各棒の上に、その棒の高さ(つまり対応する値)をテキストとして表示するためのコードを紹介しています。

  • for bar in bars:
  • * bars 変数には、ax.bar() 関数が返した、描画された個々の棒の情報が含まれています。

    * この for ループは、bars に含まれる各棒 (bar) に対して順番に処理を行います。つまり、グラフに描かれた棒の数だけ、ループの中のコードが実行されます。

  • yval = bar.get_height():
  • * ループの各回で、現在処理している棒 (bar) の高さを取得し、yval という変数に格納します。この高さは、グラフでその棒が示している値に対応します。この yval は、テキストラベルを棒の上に配置する際の Y 座標として利用されます。

  • ax.text(bar.get_x() + bar.get_width()/2.0, yval, int(yval), va=“bottom”, ha=“center”):
  • * これが実際にテキストラベルを追加する部分です。ax.text() 関数は、指定した Axes (ax) 上にテキストを表示します。

    * bar.get_x() + bar.get_width()/2.0: テキストの X 座標を指定しています。bar.get_x() で棒の左端の X 座標を取得し、それに bar.get_width()/2.0 (棒の幅の半分)を足すことで、テキストを棒の真ん中に配置するための X 座標を計算しています。

    * yval: テキストの Y 座標を指定しています。棒の高さ (yval) を指定することで、テキストが棒の「上端」の位置に表示されるようにしています。

    * int(yval): 表示するテキストの内容を指定しています。ここでは、棒の高さ (yval) を整数に変換したものをテキストとして表示しています。例えば、棒の高さが 5.0 なら、テキストは “5” となります。

    * va=“bottom”: テキストの垂直方向の整列方法を指定しています。”bottom” を指定することで、テキストの「下端」が Y 座標 (yval) に揃うように配置されます。これにより、テキストが棒の上に少し離れて表示されます。

    * ha=“center”: テキストの水平方向の整列方法を指定しています。”center” を指定することで、テキストの「中心」が X 座標 (bar.get_x() + bar.get_width()/2.0) に揃うように配置されます。これにより、テキストが棒の中心に表示されます。

このループ全体を通して、各棒についてその高さを取得し、その棒の中心の真上にその高さの値をテキストとして描画しています。

6. データ可視化における棒グラフの活用例と注意点

棒グラフは、様々なデータの比較や傾向の把握に役立ちます。ここでは、棒グラフの一般的な活用例と、使用する上での注意点について解説します。

活用例

  • カテゴリ間の数量比較: 製品別の売上高、地域別の人口、アンケートの回答数など、異なるカテゴリの数量を比較するのに適しています。
  • 時系列データの比較: 月ごとの売上推移や年間の生産量など、特定の期間におけるデータの変化を示すのに使用できます。
  • ランキングの表示: 成績上位者や人気商品のランキングなどを視覚的に表現するのに役立ちます。
  • データの分布の把握: ヒストグラムのように、データの度数を表示することで分布の形状を把握するのに使用されることもあります。

注意点

  • データのスケール: 棒グラフは通常0から始まるスケールで表示すべきです。途中の値から始めると、比較が歪められる可能性があります。
  • カテゴリの順序: カテゴリが多い場合、何らかの基準(例えば値の大小順)で並べ替えることで、グラフがより分かりやすくなります。
  • 棒の数: 棒の数が多すぎると、グラフがごちゃごちゃして、読み取りにくくなることがあります。その場合は、重要なカテゴリに絞るか、別のグラフタイプ(例:折れ線グラフ)を検討します。
  • ラベルと凡例: 各棒が何を表しているのか、凡例は何を示しているのかを明確にすることが重要です。
  • 3D棒グラフの使用: 3D棒グラフは見た目が派手になることがありますが、データの正確な読み取りを妨げることが多いため、避けるのが一般的です。

これらの活用例と注意点を踏まえることで、より効果的な棒グラフを作成し、データの洞察を深めることができます。

. 次の記事

次回は「散布図:色分け・サイズ・カラーバー」を解説します。

まとめ

本記事では、Matplotlib を用いた棒グラフの作成方法を網羅的に解説しました。

  • bar()で縦棒、barh()で横棒グラフを作成
  • 複数系列は width とX座標を調整してグループ化
  • 積み上げ棒グラフは bottom 引数で基準値を指定
  • ラベル、凡例、タイトルの設定でグラフの可読性を向上
  • カテゴリラベルの回転などで表示を調整
  • 棒グラフの幅や色、枠線などのカスタマイズ方法
  • 棒グラフはカテゴリ間の比較や構成比の把握に有効なデータ可視化手法

これらの知識を活用して、効果的なデータ可視化を行いましょう。

コメント

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