【実演付き】matplotlibで美しいグラフを作る完全ガイド

ソニック

Pythonデータ可視化の基本から実用テクニックまで

「データはあるけど、グラフがいまいち響かない」「Excelのグラフから卒業したい」

そんな悩みを解決するのが、Pythonのライブラリ「matplotlib(マットプロットリブ)」です。Python界隈で最も歴史があり、最も使われているグラフ作成ライブラリです。

この記事では、matplotlibの基本から実務で使える美しいグラフのテクニックまで、コピペで使えるコード付きで完全解説します。

さらに、記事の最後には実際に動くダッシュボードのデモも用意しました。「データ可視化って何ができるの?」が体感できる構成です。

パスワードは「admin」です。

第1章|なぜmatplotlibなのか

目次

Python界隈のグラフ作成の標準

matplotlibは2003年に登場した、Python界隈で最も歴史があるグラフ作成ライブラリです。20年以上の進化を経て、現在もデータ可視化の標準として使われ続けています。

matplotlibの3つの強み

  1. 圧倒的な情報量:日本語の解説記事・書籍が豊富
  2. 印刷・論文品質:論文・報告書に耐える高品質な画像出力
  3. カスタマイズ性:細部まで自由に調整可能

plotlyとの使い分け

当ブログではplotlyの記事も公開していますが、両者には明確な使い分けがあります。

用途matplotlibplotly
論文・報告書用◎ 最適
Webダッシュボード◎ 最適
印刷物◎ 最適
インタラクティブ操作◎ 最適

「静止画として出力」「印刷・PDF用」ならmatplotlib、「Webで動かす」ならplotlyという使い分けが基本です。

第2章|環境準備(uv環境前提)

この記事は、uv環境でPythonを使う前提で進めます。まだuvをインストールしていない方は、別記事「【完全版】uv入門」をご覧ください。

必要なライブラリ

# matplotlibとpandasをインストール
# matplotlib:グラフ作成のメインライブラリ
# pandas:データ処理(既におなじみ)
uv add matplotlib pandas

日本語フォントの設定

matplotlibはデフォルトで日本語に対応していないため、最初に設定が必要です。

# 日本語表示用のライブラリを追加
uv add japanize-matplotlib

このライブラリをインポートするだけで、日本語が文字化けせずに表示されます。

第3章|基本のグラフ4種

matplotlibの基本グラフから始めます。最初に覚えるべき4種類のグラフを、コピペで動くコードで紹介します。

折れ線グラフ

時系列データを表現する基本的なグラフ。売上推移などに使います。

import matplotlib.pyplot as plt
import matplotlib

# 日本語フォント設定(Windows)
matplotlib.rcParams["font.family"] = "Meiryo"

# データを準備
# 横軸:月、縦軸:売上額
months = ["1月", "2月", "3月", "4月", "5月"]
sales = [120, 150, 180, 165, 200]

# 折れ線グラフを作成
# marker="o" でデータ点に丸印を表示
plt.plot(months, sales, marker="o")

# グラフのタイトルと軸ラベルを設定
plt.title("月別売上推移")
plt.xlabel("月")
plt.ylabel("売上(万円)")

# グラフを表示
plt.show()

棒グラフ

カテゴリ別の比較に最適なグラフ。商品別売上などに使います。

import matplotlib.pyplot as plt
import matplotlib

# 日本語フォント設定(Windows)
matplotlib.rcParams["font.family"] = "Meiryo"

# 商品別の売上データ
products = ["商品A", "商品B", "商品C", "商品D"]
sales = [180, 120, 90, 150]

# 棒グラフを作成
# color="steelblue" で棒の色を青系に統一
plt.bar(products, sales, color="steelblue")

plt.title("商品別売上ランキング")
plt.xlabel("商品")
plt.ylabel("売上(万円)")
plt.show()

円グラフ

全体に対する構成比を表現するグラフ。売上構成比などに使います。

import matplotlib.pyplot as plt
import matplotlib

# 日本語フォント設定(Windows)
matplotlib.rcParams["font.family"] = "Meiryo"

# 構成比のデータ
labels = ["商品A", "商品B", "商品C", "商品D"]
sizes = [40, 25, 15, 20]  # 合計100%になるように

# 円グラフを作成
# autopct="%.1f%%" で各扇形にパーセント表示
plt.pie(sizes, labels=labels, autopct="%.1f%%", startangle=90)

plt.title("商品別売上構成比")
# 円を綺麗な円にするため、軸の縦横比を1:1に
plt.axis("equal")
plt.show()

散布図

2つの数値データの関係を可視化するグラフ。広告費と売上の相関などに使います。

import matplotlib.pyplot as plt
import matplotlib

# 日本語フォント設定(Windows)
matplotlib.rcParams["font.family"] = "Meiryo"

# 広告費と売上のデータ
ad_cost = [10, 20, 30, 40, 50, 60, 70]
sales = [100, 180, 250, 320, 400, 480, 560]

# 散布図を作成
# s=100 で点のサイズを指定
plt.scatter(ad_cost, sales, s=100, color="steelblue")

plt.title("広告費と売上の関係")
plt.xlabel("広告費(万円)")
plt.ylabel("売上(万円)")

# 補助線(グリッド)を表示
plt.grid(True, alpha=0.3)
plt.show()

第4章|グラフを美しく整える

matplotlibの真価は、グラフの細部まで自由にカスタマイズできること。プロ品質のグラフを作るテクニックを紹介します。

グラフのサイズと解像度

import matplotlib.pyplot as plt
import matplotlib

# 日本語フォント設定(Windows)
matplotlib.rcParams["font.family"] = "Meiryo"

# figureサイズを指定(横10インチ、縦6インチ)
# dpi=100 は解像度(数値が大きいほど高解像度)
plt.figure(figsize=(10, 6), dpi=100)

months = ["1月", "2月", "3月", "4月", "5月"]
sales = [120, 150, 180, 165, 200]

plt.plot(months, sales, marker="o")
plt.title("月別売上推移")
plt.show()

カラーパレット(マイペースブログ青系)

ブログや会社のブランドカラーで統一すると、プロ感が一気に上がります。マイペースブログの青系カラーで作る例。

import matplotlib.pyplot as plt
import matplotlib

# 日本語フォント設定(Windows)
matplotlib.rcParams["font.family"] = "Meiryo"

# マイペースブログの青系カラーパレット
colors = ["#003d99", "#0066ff", "#4d94ff", "#80b3ff", "#b3d1ff"]

products = ["商品A", "商品B", "商品C", "商品D", "商品E"]
sales = [180, 150, 120, 100, 80]

# 各棒に異なる色を適用
# zip()で「商品名・売上・色」を組み合わせて棒を描く
for product, sale, color in zip(products, sales, colors):
    plt.bar(product, sale, color=color)

plt.title("商品別売上(青系カラーパレット)")
plt.xlabel("商品")
plt.ylabel("売上(万円)")
plt.show()

複数の系列を1つのグラフに

複数の店舗の売上推移を、1つのグラフで比較する例。

import matplotlib.pyplot as plt
import matplotlib

# 日本語フォント設定(Windows)
matplotlib.rcParams["font.family"] = "Meiryo"

months = ["1月", "2月", "3月", "4月", "5月"]

# 各店舗のデータ
tokyo = [120, 150, 180, 165, 200]
osaka = [100, 130, 160, 150, 180]
nagoya = [80, 110, 140, 135, 160]

# 同じグラフに3本の折れ線を描く
# label="..." で凡例に表示される名前を指定
plt.plot(months, tokyo, marker="o", label="東京店", color="#003d99")
plt.plot(months, osaka, marker="s", label="大阪店", color="#0066ff")
plt.plot(months, nagoya, marker="^", label="名古屋店", color="#4d94ff")

plt.title("店舗別売上推移")
plt.xlabel("月")
plt.ylabel("売上(万円)")

# 凡例を表示(右上に自動配置)
plt.legend()

# グリッドを薄く表示
plt.grid(True, alpha=0.3)
plt.show()

第5章|業務で使える応用テクニック

2軸グラフ(売上と利益率)

単位の違うデータを1つのグラフで表現する技。売上(円)と利益率(%)など。

import matplotlib.pyplot as plt
import matplotlib

# 日本語フォント設定(Windows)
matplotlib.rcParams["font.family"] = "Meiryo"

months = ["1月", "2月", "3月", "4月", "5月"]
sales = [120, 150, 180, 165, 200]
margin = [0.18, 0.22, 0.25, 0.20, 0.30]  # 利益率

# fig:グラフ全体、ax1:メインの軸
fig, ax1 = plt.subplots(figsize=(10, 6))

# 主軸:売上を棒グラフで
ax1.bar(months, sales, color="#0066ff", alpha=0.7, label="売上")
ax1.set_xlabel("月")
ax1.set_ylabel("売上(万円)", color="#0066ff")
ax1.tick_params(axis="y", labelcolor="#0066ff")

# 副軸を作成:ax2 は ax1 と同じx軸を共有
ax2 = ax1.twinx()
# 副軸:利益率を折れ線で
ax2.plot(months, margin, color="#dc2626", marker="o", linewidth=2, label="利益率")
ax2.set_ylabel("利益率", color="#dc2626")
ax2.tick_params(axis="y", labelcolor="#dc2626")

plt.title("月別売上と利益率の推移")
fig.tight_layout()  # レイアウト自動調整
plt.show()

サブプロット(複数グラフ並列)

ダッシュボード風に複数のグラフを並べる技。

import matplotlib.pyplot as plt
import matplotlib

# 日本語フォント設定(Windows)
matplotlib.rcParams["font.family"] = "Meiryo"

# 2行2列の領域を作成、figサイズも大きく
fig, axes = plt.subplots(2, 2, figsize=(12, 8))

months = ["1月", "2月", "3月", "4月", "5月"]
sales = [120, 150, 180, 165, 200]

# 左上:折れ線グラフ
axes[0, 0].plot(months, sales, marker="o", color="#0066ff")
axes[0, 0].set_title("月別売上推移")

# 右上:棒グラフ
axes[0, 1].bar(months, sales, color="#4d94ff")
axes[0, 1].set_title("月別売上(棒)")

# 左下:散布図
ax_cost = [10, 20, 30, 40, 50]
ax_sale = [100, 180, 250, 320, 400]
axes[1, 0].scatter(ax_cost, ax_sale, color="#003d99", s=80)
axes[1, 0].set_title("広告費と売上")

# 右下:横棒グラフ
products = ["A", "B", "C", "D"]
p_sales = [180, 120, 90, 150]
axes[1, 1].barh(products, p_sales, color="#0066ff")
axes[1, 1].set_title("商品別売上")

# 全体のタイトルを設定
fig.suptitle("売上ダッシュボード", fontsize=16, fontweight="bold")
# レイアウトを自動調整
plt.tight_layout()
plt.show()

画像として保存

作成したグラフを画像ファイルとして保存します。報告書・プレゼン資料に活用できます。

import matplotlib.pyplot as plt
import matplotlib

# 日本語フォント設定(Windows)
matplotlib.rcParams["font.family"] = "Meiryo"

months = ["1月", "2月", "3月"]
sales = [120, 150, 180]

plt.figure(figsize=(10, 6))
plt.plot(months, sales, marker="o")
plt.title("月別売上推移")

# PNG形式で保存
# dpi=300 で高解像度(印刷品質)
# bbox_inches="tight" で余白を最小化
plt.savefig("売上グラフ.png", dpi=300, bbox_inches="tight")
print("画像を保存しました")

第6章|matplotlibの実演デモ

実際に動くダッシュボードを体験

ここまでmatplotlibで作るグラフを解説してきましたが、「実際に動くダッシュボード」を見ていただくのが一番分かりやすいと思います。

以下のリンクから、当ブログで作成したサンプルダッシュボードを実際に操作できます。
(パスワードは「admin」です)

デモで体験できる機能

  • 月別売上推移の折れ線グラフ
  • 商品別ランキングの棒グラフ
  • 売上構成比の円グラフ
  • 店舗フィルターでの絞り込み
  • マイペースブログの青系カラー統一デザイン

デモはplotly(Webブラウザ表示用)を使用していますが、データの可視化の発想や設計はmatplotlibと共通です。「matplotlibで作るとこんな雰囲気」をイメージするのに役立ちます。

第7章|つまずき対処&まとめ

よくあるトラブル

トラブル1:日本語が「□□□」と表示される

原因:

matplotlibに日本語フォントが設定されていない。

対処:

# japanize-matplotlib をインストールして読み込む
# これだけで日本語対応
import japanize_matplotlib

トラブル2:グラフが表示されない

原因:

plt.show()を書き忘れている。または、保存だけして表示していない。

対処:

# plt.show() でグラフを画面に表示する
plt.show()

# またはファイル保存
plt.savefig("graph.png")

トラブル3:軸ラベルが見切れる

対処:

# tight_layout() で自動的にレイアウト調整
plt.tight_layout()

# または、ラベルを斜めにする
plt.xticks(rotation=45)

トラブル4:色を変えたい

対処:

# 色名で指定
plt.plot(x, y, color="red")

# HEXコード(#RRGGBB)で指定
plt.plot(x, y, color="#0066ff")

# 透明度(alpha)も指定可能(0=透明、1=不透明)
plt.bar(x, y, color="#0066ff", alpha=0.7)

この記事のまとめ

  • matplotlibはPython界隈のグラフ作成標準ライブラリ
  • japanize_matplotlibで日本語対応が一発
  • 折れ線・棒・円・散布の4種類で大半の業務に対応できる
  • 色・サイズ・解像度を調整すれば、プロ品質のグラフに
  • 2軸グラフ・サブプロットで本格的なダッシュボードも可能
  • Web表示はplotly、印刷物はmatplotlibと使い分けるのが理想

FAQ

Q1. matplotlibとplotlyはどちらを学ぶべきですか?

両方学ぶのが理想ですが、業務目的によります。印刷物・報告書を作る場合はmatplotlib、Webダッシュボードを作る場合はplotlyを優先しましょう。

Q2. matplotlibで作ったグラフをExcelに貼れますか?

はい、PNG画像として保存すれば、Excelに画像として貼り付けられます。pdf・svgでも保存可能で、印刷物にそのまま使えます。

Q3. グラフの色やデザインを統一したい場合は?

matplotlibのスタイル機能(plt.style.use())を使うと、複数のグラフのデザインを一括で統一できます。プロジェクトごとに色設定をテンプレ化するのがおすすめです。

Q4. 学習にどれくらい時間がかかりますか?

基本のグラフ4種を使えるようになるまでなら、1〜2時間で十分です。応用テクニック(2軸・サブプロット等)まで含めても、1〜2週間で実務レベルに到達できます。

Q5. seabornという別ライブラリも聞きますが、関係は?

seabornはmatplotlibの上に作られたライブラリで、より美しい統計的なグラフを簡単に作れます。matplotlibの基礎ができれば、seabornもすぐに使えるようになります。

グラフで、データを物語ろう

matplotlibを使えば、データを単なる数字の羅列から「物語」に変えることができます。今日紹介したテクニックを、明日の業務でぜひ試してみてください。

最新の解説記事は、新着記事から順次公開しています。X(旧Twitter)でも更新情報を発信していますので、ぜひフォローしてください。

この記事を書いた人

ソニック|バックオフィス出身の業務効率化ブロガー。データサイエンス業務で顧客レポートにmatplotlibを日常的に活用中。リアルな実体験をもとにしたノウハウを発信中。

→ 詳しいプロフィールはこちら→ はじめての方へ

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次