ソニックPythonデータ可視化の基本から実用テクニックまで
「データはあるけど、グラフがいまいち響かない」「Excelのグラフから卒業したい」
そんな悩みを解決するのが、Pythonのライブラリ「matplotlib(マットプロットリブ)」です。Python界隈で最も歴史があり、最も使われているグラフ作成ライブラリです。
この記事では、matplotlibの基本から実務で使える美しいグラフのテクニックまで、コピペで使えるコード付きで完全解説します。
さらに、記事の最後には実際に動くダッシュボードのデモも用意しました。「データ可視化って何ができるの?」が体感できる構成です。
パスワードは「admin」です。


第1章|なぜmatplotlibなのか
Python界隈のグラフ作成の標準
matplotlibは2003年に登場した、Python界隈で最も歴史があるグラフ作成ライブラリです。20年以上の進化を経て、現在もデータ可視化の標準として使われ続けています。
matplotlibの3つの強み
- 圧倒的な情報量:日本語の解説記事・書籍が豊富
- 印刷・論文品質:論文・報告書に耐える高品質な画像出力
- カスタマイズ性:細部まで自由に調整可能
plotlyとの使い分け
当ブログではplotlyの記事も公開していますが、両者には明確な使い分けがあります。
| 用途 | matplotlib | plotly |
|---|---|---|
| 論文・報告書用 | ◎ 最適 | △ |
| 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
グラフで、データを物語ろう
matplotlibを使えば、データを単なる数字の羅列から「物語」に変えることができます。今日紹介したテクニックを、明日の業務でぜひ試してみてください。
最新の解説記事は、新着記事から順次公開しています。X(旧Twitter)でも更新情報を発信していますので、ぜひフォローしてください。
この記事を書いた人
ソニック|バックオフィス出身の業務効率化ブロガー。データサイエンス業務で顧客レポートにmatplotlibを日常的に活用中。リアルな実体験をもとにしたノウハウを発信中。


コメント