【Python】棒グラフの作り方をわかりやすく解説

はじめに

皆さんは、Pythonを使った可視化に興味をお持ちではないでしょうか。
数字ばかりのデータをそのまま眺めるより、棒グラフのような形で視覚化すると、傾向や特徴が理解しやすくなります。

Pythonでは、matplotlibというライブラリを使うことで棒グラフを作るのが一般的です。
さらに、seabornplotlyなどを活用すると、より見た目にこだわったグラフを作ることもできます。

この記事では、Pythonで棒グラフを作るメリットや基本的な作り方、応用的なカスタマイズ方法などを解説していきます。
実務での活用シーンをイメージできるよう、できるだけ具体的なコード例を交えながら話を進めます。

この記事を読むとわかること

  • Pythonで棒グラフを作る主なメリット
  • matplotlibを使った基本的な棒グラフの作り方
  • seabornやplotlyなどを使った応用的な可視化方法
  • 実務で役立ちそうなカスタマイズ例や注意点
  • グラフを活用するときの勘所と活用シーン

棒グラフとは何か

棒グラフは、カテゴリーごとの値を比較するために使われるグラフの形式です。
縦軸または横軸にデータの値、もう一方の軸にカテゴリーを割り当てます。
例えば、部門ごとの売上、月ごとの利益、アンケート集計での選択肢の選ばれ方など、カテゴリーを持つデータを可視化するときに便利です。

単なる数値リストでは見えにくかった「どこが一番多いか」「どのカテゴリーが極端に少ないか」などを、一目で把握しやすくなる特徴があります。
そのため、レポートやプレゼン資料でもよく使われています。

実務においては、販売管理システムから出力されるデータをExcel形式で受け取り、それをPythonで読み込んだ上でグラフにするような場面が多いかもしれません。
このような形で扱うと、グラフが自動生成されるため、一度スクリプトを組んでおくと作業効率が向上します。

Pythonで棒グラフを作るメリット

Pythonで棒グラフを作るメリットとしては、次のような点が挙げられます。

コードによる再現性

GUI操作でグラフを作る場合はどうしても手作業になります。
一方、Pythonのコードで棒グラフを生成すれば、同じスクリプトを何度でも再利用できます。
商品の売上データが毎月更新される場合など、コードを実行し直すだけで最新のグラフがサッと生成できるでしょう。

豊富なカスタマイズ

見た目を整えるために、色やラベル、軸のメモリなどを細かく指定できます。
縦向きや横向き、積み上げ棒グラフなどバリエーションも豊富です。
さらに複数のグラフを並べて比較するサブプロットなども簡単に扱えます。

他のPythonライブラリとの連携

Pythonでは、pandasでデータを処理し、matplotlibseabornで可視化するといったワークフローが簡単に実現できます。
データ分析や機械学習の工程ともスムーズに連携しやすい点が魅力です。

matplotlibで棒グラフを作る基本手順

Pythonで棒グラフを描く最も代表的な方法として、matplotlibというライブラリを使用します。
ここでは、初心者でも分かりやすいように、順を追ってコード例を紹介します。

matplotlibのインポートとデータ準備

まずはmatplotlibをインポートし、簡単なデータを用意します。
以下の例では、カテゴリーを表すリストと、そのカテゴリーごとの数値データを用意しています。
サンプルとして「各部署の売上」をイメージしてみてください。

import matplotlib.pyplot as plt

# 部署名を示すカテゴリー
departments = ["営業", "開発", "人事", "経理", "総務"]
# それぞれの売上金額をイメージ
sales = [150, 200, 80, 120, 90]

plt.bar() で棒グラフを描画

棒グラフを描くには、matplotlibの bar() 関数を使用します。
基本的には、横軸にカテゴリーの位置、縦軸に数値を割り当てる形を取ります。
bar() 関数には、x座標と棒の高さとなる数値のリストを渡すだけで描画が可能です。

import matplotlib.pyplot as plt

departments = ["営業", "開発", "人事", "経理", "総務"]
sales = [150, 200, 80, 120, 90]

# x座標を0から順に振り分ける(カテゴリー数に合わせてRange関数などを使う)
x_positions = range(len(departments))

plt.bar(x_positions, sales)
plt.xticks(x_positions, departments)  # x軸にカテゴリー名を表示
plt.xlabel("部署")
plt.ylabel("売上")
plt.title("部署別売上比較")
plt.show()

このコードを実行すると、部署別の棒グラフが表示されます。
カテゴリーのラベルをしっかり表示するために、xticks() を使って部署名を設定している点がポイントです。

棒グラフのカスタマイズ

棒グラフは、色や太さ、ラベルの書体などを細かく調整することが多いです。
見やすさや社内規定のブランドカラーを取り入れるなど、実務ではデザインにも気を遣う場面があります。

棒の色と幅を変える

plt.bar() には、引数 colorwidth などを渡せます。
例えば、バーの色を青にし、幅を細めにする場合は次のように指定します。

plt.bar(x_positions, sales, color="blue", width=0.5)

幅を小さくしたい場合は width=0.5 の値を0.2〜0.5程度に調整すると見やすくなるかもしれません。
また、色は "red", "green", "yellow" のような名前付きや、 "#FF5733" のような16進数指定もできます。

グリッド線の表示

グリッド線があると、縦軸の数値を読み取りやすくなります。
例えば、次のように plt.grid() を呼び出すと、水平方向の補助線を表示できます。

plt.bar(x_positions, sales, color="blue", width=0.5)
plt.xticks(x_positions, departments)
plt.grid(axis="y")

axis="y" と指定すると、y軸方向にのみグリッド線が引かれるため棒グラフの見やすさが向上するでしょう。

ラベルを追加する

棒の上に値を表示すると、データの具体的な数値を伝えやすくなります。
matplotlibには、棒の上にテキストを表示するための方法がいくつかありますが、 text() を使った方法がシンプルです。

import matplotlib.pyplot as plt

departments = ["営業", "開発", "人事", "経理", "総務"]
sales = [150, 200, 80, 120, 90]
x_positions = range(len(departments))

plt.bar(x_positions, sales, color="blue", width=0.5)
plt.xticks(x_positions, departments)

# バーの上に数値を表示
for x, val in zip(x_positions, sales):
    plt.text(x, val + 3, str(val), ha="center")

plt.grid(axis="y")
plt.xlabel("部署")
plt.ylabel("売上")
plt.title("部署別売上比較(数値付き)")
plt.show()

この例では、バーの上に3だけ余白を足した位置に text() を書いています。
引数の ha="center" は水平方向の揃えを中央にするという指定です。

横向きの棒グラフ(barh)

棒グラフは、横向きに描画することも可能です。
matplotlibでは bar() の代わりに barh() 関数を使います。
縦長のデータを扱うときや、カテゴリー名が長くて横軸に並べにくいときなどに重宝します。

import matplotlib.pyplot as plt

departments = ["営業", "開発", "人事", "経理", "総務"]
sales = [150, 200, 80, 120, 90]
y_positions = range(len(departments))

plt.barh(y_positions, sales, color="green")
plt.yticks(y_positions, departments)
plt.xlabel("売上")
plt.ylabel("部署")
plt.title("部署別売上(横向き)")
plt.show()

このように、横向きグラフの場合は barh() を使い、ラベル設定も yticks() を用いるのが一般的です。

複数カテゴリーの比較:グループ化と積み上げ

実務の中では、単一のカテゴリーだけでなく、複数の項目をまとめて比較するケースもあるでしょう。
例えば、「部署別」かつ「月別」で売上を比較したい場合などです。

グループ化された棒グラフ

グループ化された棒グラフでは、横軸に部署、横方向に月を並べるようにすると、同じ部署の月ごとの比較が一目で分かります。
例えば、部署別の1月売上と2月売上を横に並べて表示するコード例がこちらです。

import matplotlib.pyplot as plt
import numpy as np

departments = ["営業", "開発", "人事", "経理", "総務"]
# 1月と2月の売上を用意
sales_jan = [150, 200, 80, 120, 90]
sales_feb = [160, 210, 100, 110, 95]

x_positions = np.arange(len(departments))
width = 0.4  # バーの幅

plt.bar(x_positions - width/2, sales_jan, width=width, label="1月")
plt.bar(x_positions + width/2, sales_feb, width=width, label="2月")

plt.xticks(x_positions, departments)
plt.xlabel("部署")
plt.ylabel("売上")
plt.title("部署別売上比較(1月と2月)")
plt.legend()
plt.show()

np.arange() を使って連番を作り、そこからバーを左右にずらすイメージです。
これによって、同じ部署で1月と2月のバーが横並びになるので、時期ごとの比較を見やすくできます。

積み上げ棒グラフ

積み上げ棒グラフは、1本の棒の中に複数のデータを積み上げて表示します。
例えば「製品Aと製品Bの合計売上を部署ごとに可視化したい」というようなケースで便利です。

import matplotlib.pyplot as plt

departments = ["営業", "開発", "人事", "経理", "総務"]
sales_A = [100, 120, 60, 80, 70]
sales_B = [50, 80, 20, 40, 20]

x_positions = range(len(departments))

plt.bar(x_positions, sales_A, label="製品A")
plt.bar(x_positions, sales_B, bottom=sales_A, label="製品B")

plt.xticks(x_positions, departments)
plt.xlabel("部署")
plt.ylabel("売上")
plt.title("部署別売上の積み上げ棒グラフ")
plt.legend()
plt.show()

ここでは、最初に sales_A をバーに描いた後、 sales_B を描く際に bottom=sales_A を指定しています。
こうすることで、製品Aの棒の上に製品Bの値が重なるように描画されます。

seabornを使った棒グラフ

seaborn は、matplotlibをベースにより見やすいデザインや高水準のAPIを提供してくれるライブラリです。
棒グラフを作る場合でも、barplot()countplot() などの関数を活用できます。

seabornのbarplot()

barplot() は、xとyを指定するだけで棒グラフを描いてくれます。
カテゴリカルデータを扱うときに便利な機能が多いため、データフレームを使う場面で特に威力を発揮します。

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd

data = {
    "department": ["営業", "開発", "人事", "経理", "総務"],
    "sales": [150, 200, 80, 120, 90]
}
df = pd.DataFrame(data)

sns.barplot(x="department", y="sales", data=df)
plt.xlabel("部署")
plt.ylabel("売上")
plt.title("seabornで描く部署別売上グラフ")
plt.show()

データフレーム(df)をそのまま渡せるので、pandasで集計した結果を可視化しやすいのが特徴です。
また、デフォルトの配色やスタイルが整っているため、最小限のコードである程度見栄えの良いグラフが得られます。

plotlyでインタラクティブな棒グラフ

plotly というライブラリを使うと、Webブラウザ上でインタラクティブに動くグラフを作れます。
マウスを重ねると値がポップアップ表示されたり、ズーム機能があったりと、より動きのある可視化を実装できるでしょう。

plotlyの基本的な使い方

plotlyでは、graph_objects(略称:go)の Bar を使って棒グラフを描きます。
以下は簡単な例です。

import plotly.graph_objects as go

departments = ["営業", "開発", "人事", "経理", "総務"]
sales = [150, 200, 80, 120, 90]

fig = go.Figure(
    data=[go.Bar(x=departments, y=sales, marker_color="orange")],
    layout=go.Layout(
        title="部署別売上(plotly版)",
        xaxis=dict(title="部署"),
        yaxis=dict(title="売上")
    )
)

fig.show()

fig.show() を呼び出すと、Webブラウザか、Jupyter Notebook上でインタラクティブなグラフが表示されます。
実務でWebアプリケーションを開発するとき、plotlyを組み込むとリアルタイムで操作できるグラフを提供しやすくなります。

棒グラフを実務で活用する場面

棒グラフは、ビジネスの現場においてさまざまな形で利用できます。
以下のようなシーンでは、Pythonでグラフを自動生成する仕組みを作っておくと便利かもしれません。

売上データの可視化

月ごとの売上推移、製品ラインナップ別の売上比較、地域別の販売数などを棒グラフで表現します。
ExcelやCSVで管理しているデータをPythonで読み込んで処理し、そのままレポートを生成することも可能です。

在庫管理やロジスティクス

倉庫内の在庫数や出荷実績をカテゴリーごとに可視化します。
あるカテゴリーに在庫が偏っていないか、異常値がないかなどの確認にも役立ちます。

アンケート結果

選択肢別に回答数を集計し、棒グラフで表示することでどの意見が多いかひと目でわかります。
複数の選択肢を組み合わせた積み上げ棒グラフを使うのも良いでしょう。

よくあるエラーや注意点

Pythonで棒グラフを描くとき、初心者の方は次のような点でつまずくかもしれません。

ライブラリのインポート忘れ

import matplotlib.pyplot as plt を忘れていたり、環境にmatplotlibがインストールされていなかったりするとエラーが出ます。
仮想環境で作業している場合は、ライブラリが入っているかを確認してみましょう。

x軸やy軸のラベルが対応しない

配列の長さが合っていない場合や、 xticks() で誤った範囲を指定している場合、意図しない位置にラベルが表示されるかもしれません。
x軸とカテゴリーのリストの長さをきちんと確認してください。

Unicode関連の警告

日本語を含むラベルを使うと、文字化けやフォント設定のエラーが起きることがあります。
その場合はmatplotlibのフォント設定を行う必要がありますが、やや細かい設定なので、最初は標準環境のフォントで試してみるのも手かもしれません。

グラフを見やすくするためのポイント

棒グラフを扱うときは、次のような点を意識すると、より見やすいグラフに仕上がります。

適切な目盛り

極端に大きな値や小さな値が混在している場合、棒グラフだといずれかが見にくくなる可能性があります。
ログスケールに変えてみる、あるいは一部のデータを切り分けるなど、グラフ全体の視認性を確保しましょう。

カテゴリーの順番を工夫

アルファベット順や部署番号順にするより、大きい順、小さい順に並べたほうが傾向を読み取りやすいこともあります。
カテゴリーの数が多い場合は、上位5つだけを表示して「その他」とまとめるなどの工夫も考えられます。

カラーコーディング

複数カテゴリーを表示する際、同系色を使いすぎると判別が難しくなることがあります。
適度にコントラストのある色を選ぶか、パレットを用意すると良いでしょう。

実務のプレゼンテーション資料では、社内のブランドカラーやガイドラインに合わせることが求められることが多いです。
その場合は、デザイン担当の方と相談しつつ、Pythonコードの中で色やフォントの指定を調整すると良いでしょう。

大規模データや複雑な可視化への発展

棒グラフは基本的な可視化手法ですが、大量のカテゴリーがある場合や何重にも分類があるときは、グラフが複雑化する可能性があります。
その場合は以下のような対策を検討してください。

グループ化・フィルタリング

カテゴリーがあまりに多い場合は、ある程度まとめたり、必要な部分だけフィルタリングしたりして、可視化する情報量を絞るのも方法のひとつです。

サブプロットで分割

1つのグラフに情報を詰め込みすぎると、かえって見づらくなります。
部署ごとにサブプロットを作成して比較するなど、複数のグラフに分割して表示してみるのも良いでしょう。

インタラクティブツールの活用

plotlyやBokehといったインタラクティブな可視化ライブラリを使うと、ツールチップやズーム機能を使って大量のデータを扱いやすくなります。

実務での運用例

棒グラフを日々の業務で自動生成するために、以下のような手順で運用する例を紹介します。

1. データ取得

売上データや在庫データなどを定期的に取得する。
CSVやExcel形式、あるいはデータベースから直接読み込むことも多いです。

2. データ前処理

pandasを使って必要な行だけ抽出、集計などの処理を行う。
部署ごとの合計売上を算出したり、グループ化による小計などをまとめたりする。

3. 棒グラフ生成スクリプトの実行

Pythonスクリプトでmatplotlibやseabornを呼び出し、棒グラフを出力する。
ここで色やラベルなどの設定もカスタマイズする。

4. 結果の保存・共有

plt.savefig("graph.png") のようにして画像に出力し、メールやチャットツールで共有する。
もしくは社内ポータルに貼り付けて、リアルタイムで見られる状態にしておく。

この仕組みを一度作っておくと、あとは定期的にデータが更新されるたびにスクリプトを走らせるだけで新しいグラフが手に入ります。

データ量が極端に多い場合や、データの更新頻度が高い場合には、実行環境への負荷を考慮してください。
大量のカテゴリーを一度に棒グラフ化すると処理時間や表示時間がかさむこともあるので、必要に応じてデータを絞り込む工夫が必要です。

まとめ

ここまで、Pythonで棒グラフを作成する方法やカスタマイズ例についてお伝えしました。
棒グラフは、カテゴリーごとの数値比較を分かりやすく伝えるために欠かせない可視化手法です。

特に、実務であれば、部署別の売上や在庫など、カテゴリーと数値が並んだデータを可視化する場面はよくあるでしょう。
Pythonのコードを活用すると、一度スクリプトを作れば、その後はほぼ自動でグラフが作成できるため、手間を減らせるところが魅力です。

初心者の皆さんは、まずはmatplotlibで1つ棒グラフを表示してみるところからスタートすると良いでしょう。
慣れてきたらseabornでデザイン性の高いグラフにしたり、plotlyでインタラクティブ機能を加えたりして、用途に合わせたカスタマイズを行ってみてください。

Pythonで棒グラフを自在に作れるようになれば、データを「視覚化する力」が大きく高まります。
ぜひ日々の業務や学習の中で使いこなしてみてはいかがでしょうか。

Pythonをマスターしよう

この記事で学んだPythonの知識をさらに伸ばしませんか?
Udemyには、現場ですぐ使えるスキルを身につけられる実践的な講座が揃っています。