【Pandasデータ可視化】df.plotでチャート作成完全ガイド
生の数値をじっと眺めたい人はいません。上司はチャートを求め、報告書にはチャートが必要で、プレゼン資料にもチャートが欠かせません。Pandasのdf.plotは、内部でMatplotlibエンジンを活用し、たった1行でチャートを生成できます。本セクションでは、最もよく使われる8種類のチャートタイプ、サブプロットのレイアウト、スタイルカスタマイズを解説し、どんなDataFrameでもすばやくビジュアルレポートに変換できるようにします。
⚠️ 注意: 以下のコードは、matplotlibがインストールされたローカルのPython環境で実行してください。
1. 学習内容
- ❶ df.plotの基本
- ❷ チャートの種類(line/bar/hist/box/scatter/pie/area/kde)
- ❸ サブプロットのレイアウト
- ❹ スタイルカスタマイズ
- ❺ 保存とエクスポート
2. ボブの売上可視化レポート
(1) 問題:誰も表を読んでくれない
ボブは毎月の売上を上司に報告していますが、プレーンな表をわざわざ見てくれる人はいません。
(2) 解決策:df.plotで1行チャート
▶ サンプル:df.plotの基本(難易度 ⭐)
PYTHON
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# サンプルデータ
df = pd.DataFrame({
'month': ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun'],
'sales': [3200, 3500, 3800, 3600, 4100, 4500],
'cost': [2000, 2200, 2400, 2300, 2600, 2800]
})
df = df.set_index('month')
# 折れ線グラフ — コード1行で完成!
df['sales'].plot(kind='line', title='Monthly Sales Trend', figsize=(8, 4))
plt.ylabel('Sales ($)')
plt.tight_layout()
# plt.savefig('sales_trend.png', dpi=150)
# plt.show()
print("折れ線グラフを作成しました!")
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)して実行してください。実際の値はpandasのバージョンにより若干異なる場合があります。
3. チャートタイプ早見表
(1) よく使う8種類のチャート
| kind | チャート | 用途 |
|---|---|---|
| line | 折れ線グラフ | 時系列のトレンド |
| bar | 棒グラフ | カテゴリ間の比較 |
| barh | 横棒グラフ | ラベルが長いカテゴリ |
| hist | ヒストグラム | 分布 |
| box | 箱ひげ図 | 分布+外れ値 |
| scatter | 散布図 | 相関関係 |
| pie | 円グラフ | 構成比 |
| area | 面積グラフ | 累積トレンド |
| kde | カーネル密度 | スムーズな分布 |
▶ サンプル
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)して実行してください。実際の値はpandasのバージョンにより若干異なる場合があります。
:複数のチャートタイプ(難易度 ⭐⭐)
PYTHON
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(42)
df = pd.DataFrame({
'category': ['Electronics', 'Clothing', 'Home', 'Sports', 'Books'],
'sales': [5000, 3000, 2000, 1500, 800],
'avg_price': [299, 55, 75, 45, 15],
'rating': [4.5, 4.2, 3.9, 4.0, 4.3]
})
# 棒グラフ — カテゴリ間の比較
df.plot(kind='bar', x='category', y='sales', title='Sales by Category', figsize=(8, 4))
# plt.show()
# 横棒グラフ — 長いラベルに適している
df.plot(kind='barh', x='category', y='sales')
# plt.show()
# 円グラフ — 構成比
df.set_index('category')['sales'].plot(kind='pie', autopct='%1.1f%%', figsize=(6, 6))
# plt.show()
# ヒストグラム — 分布
prices = pd.Series(np.random.normal(100, 30, 500))
prices.plot(kind='hist', bins=20, title='Price Distribution')
# plt.show()
# 箱ひげ図 — 分布+外れ値
scores = pd.DataFrame({
'Math': np.random.normal(75, 10, 100),
'English': np.random.normal(80, 12, 100),
'Science': np.random.normal(70, 15, 100)
})
scores.plot(kind='box', title='Score Distribution by Subject')
# plt.show()
# 散布図 — 相関関係
df.plot(kind='scatter', x='avg_price', y='rating', title='Price vs Rating', s=100)
# plt.show()
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)して実行してください。実際の値はpandasのバージョンにより若干異なる場合があります。
4. サブプロットのレイアウト
▶ サンプル
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)して実行してください。実際の値はpandasのバージョンにより若干異なる場合があります。
:subplotsによる複数チャートレイアウト(難易度 ⭐⭐)
PYTHON
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(42)
df = pd.DataFrame({
'A': np.random.randn(50).cumsum(),
'B': np.random.randn(50).cumsum(),
'C': np.random.randn(50).cumsum(),
'D': np.random.randn(50).cumsum()
})
# 各列を個別のサブプロットに配置
df.plot(subplots=True, layout=(2, 2), figsize=(10, 8), sharey=True)
plt.suptitle('4 Series Trend')
plt.tight_layout()
# plt.show()
# カスタムレイアウト
df[['A', 'B']].plot(subplots=True, layout=(1, 2), figsize=(12, 4))
# plt.show()
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)して実行してください。実際の値はpandasのバージョンにより若干異なる場合があります。
5. スタイルカスタマイズ
▶ サンプル
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)して実行してください。実際の値はpandasのバージョンにより若干異なる場合があります。
:スタイルカスタマイズ(難易度 ⭐⭐)
PYTHON
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(42)
df = pd.DataFrame({
'sales': np.random.randint(100, 500, 12),
'profit': np.random.randint(10, 150, 12)
}, index=pd.date_range('2024-01', periods=12, freq='MS').strftime('%b'))
# 色、マーカー、線のスタイルをカスタマイズ
ax = df.plot(
kind='line',
style=['o-', 's--'], # マーカー+線のスタイル
color=['#2196F3', '#FF5722'], # カスタムカラー
figsize=(10, 5),
title='Monthly Sales & Profit',
xlabel='Month',
ylabel='Amount ($)',
grid=True,
alpha=0.8
)
# 注釈を追加
ax.axhline(y=df['sales'].mean(), color='gray', linestyle=':', label='Avg Sales')
ax.legend(loc='upper left')
plt.tight_layout()
# plt.show()
print("スタイル付きチャートを作成しました!")
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)して実行してください。実際の値はpandasのバージョンにより若干異なる場合があります。
6. PandasとMatplotlibの比較
| 機能 | df.plot | Matplotlib |
|---|---|---|
| コード行数 | 1行 | 5〜15行 |
| 柔軟性 | 中 | 高 |
| 学習コスト | 低い | 高い |
| カスタマイズ性 | 基本 | 無制限 |
| 関係性 | Matplotlibをラップ | 基盤エンジン |
💡 ヒント: df.plotはMatplotlibのAxesオブジェクトを返すため、Matplotlibのメソッドで引き続き細かく調整できます。戦略としては、df.plotで素早くドラフトを作成し、Axesオブジェクトで詳細を微調整するのがおすすめです。
7. 総合例:ECサイト売上可視化レポート
(4) ▶ チャート選択の判断ツリー
graph TB
A[何を見せたいですか?] --> B{時系列のトレンド?}
B -->|はい| C[折れ線グラフ]
B -->|いいえ| D{カテゴリ間の比較?}
D -->|はい| E[棒グラフ]
D -->|いいえ| F{データの分布?}
F -->|はい| G[ヒストグラム hist / 箱ひげ図]
F -->|いいえ| H{相関関係?}
H -->|はい| I[散布図]
H -->|いいえ| J{構成比?}
J -->|はい| K[円グラフ]
J -->|いいえ| L[面積グラフ]
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)して実行してください。実際の値はpandasのバージョンにより若干異なる場合があります。
▶ サンプル
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)して実行してください。実際の値はpandasのバージョンにより若干異なる場合があります。
:可視化レポートの完全ワークフロー(難易度 ⭐⭐⭐)
PYTHON
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# ============================================
# 総合例:ECサイトの売上可視化レポート
# 複数チャートを含むレポート作成
# ============================================
np.random.seed(42)
df = pd.DataFrame({
'month': pd.date_range('2024-01', periods=12, freq='MS'),
'Electronics': np.random.randint(3000, 8000, 12),
'Clothing': np.random.randint(1000, 4000, 12),
'Home': np.random.randint(500, 2500, 12),
'Sports': np.random.randint(300, 1500, 12)
})
df = df.set_index('month')
# 1. 折れ線グラフ:月次トレンド
fig, axes = plt.subplots(2, 2, figsize=(14, 10))
df.plot(ax=axes[0, 0], kind='line', title='Monthly Sales by Category')
axes[0, 0].set_ylabel('Sales ($)')
# 2. 棒グラフ:カテゴリ別合計
df.sum().plot(ax=axes[0, 1], kind='bar', title='Annual Sales by Category', color='steelblue')
axes[0, 1].set_ylabel('Total Sales ($)')
# 3. 円グラフ:市場シェア
df.sum().plot(ax=axes[1, 0], kind='pie', autopct='%1.1f%%', title='Market Share')
# 4. 面積グラフ:累積トレンド
df.plot(ax=axes[1, 1], kind='area', alpha=0.5, title='Cumulative Sales Trend')
axes[1, 1].set_ylabel('Sales ($)')
plt.suptitle('2024 E-Commerce Sales Report', fontsize=16)
plt.tight_layout()
# plt.savefig('sales_report.png', dpi=150, bbox_inches='tight')
print("4チャートのレポートを作成しました!")
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)して実行してください。実際の値はpandasのバージョンにより若干異なる場合があります。
❓ よくある質問
Q PandasのplotとMatplotlibの関係は何ですか?
A df.plotはMatplotlibの上位ラッパーです。内部でmatplotlib.pyplotを呼び出し、Axesオブジェクトを返します。シンプルなチャートにはdf.plot(1行で完了)、複雑なカスタマイズにはMatplotlib(df.plotでベースチャートを作成し、Axesメソッドで調整)を使い分けます。両方はシームレスに連携します。
Q kindパラメータにはどのような値を指定できますか?
A line(折れ線グラフ/デフォルト)、bar(棒グラフ)、barh(横棒グラフ)、hist(ヒストグラム)、box(箱ひげ図)、kde/density(カーネル密度)、area(面積グラフ)、pie(円グラフ)、scatter(散布図)、hexbin(六角形ビニング)です。最もよく使われるのはline/bar/hist/scatterです。
Q サブプロットはどのように配置しますか?
A subplots=Trueで各列が個別のサブプロットになり、layout=(行数, 列数)でグリッドを指定します。例えばlayout=(2,2)で2x2のグリッドを作成します。sharex/sharey=Trueでサブプロット間の軸を共有します。手動で配置することも可能で、
fig, axes = plt.subplots(2,2)の後にdf.plot(ax=axes[0,0])で特定の位置にチャートを配置できます。Q チャートを画像として保存するにはどうすればよいですか?
A
plt.savefig('filename.png', dpi=150, bbox_inches='tight')を使用します。dpiパラメータは解像度を制御します(150=中品質、300=高品質)。bbox_inches='tight'はラベルの切り切れを防ぎます。対応フォーマットはpng/jpg/svg/pdfです。保存前にplt.show()を呼び出さないでください(showはfigureをクリアしてしまいます)。Q 日本語フォントの文字化けを修正するにはどうすればよいですか?
A 2つの方法があります。(1)
plt.rcParams['font.sans-serif'] = ['SimHei']で中国語フォントを設定(Windows)。(2)タイトルやラベルに英語を使用する(推奨、フォント互換性の問題を回避できます)。方法2はより汎用的で、フォントファイルに依存せずクロスプラットフォームで動作します。Q 散布図にカラーマッピングを追加するにはどうすればよいですか?
A cパラメータで色分けする列を指定します:
df.plot(kind='scatter', x='price', y='rating', c='sales', cmap='viridis', colorbar=True)。cmapパラメータでカラーマップを設定し(viridis/coolwarm/RdYlGn)、colorbarで凡例を表示します。sパラメータはマーカーのサイズを制御します。Q 同じ軸に複数のプロットを重ねるにはどうすればよいですか?
A axパラメータを使用します:
ax1 = df1.plot()の後にdf2.plot(ax=ax1)とします。2つ目のプロットが1つ目に重ねられ、同じ軸を共有します。複数のデータセットを比較するのに最適です。labelとlegendを設定して区別します。📖 まとめ
- df.plot(kind=...)は1行でチャートを作成でき、内部でMatplotlibが動作しています
- 8種類のチャート:line(トレンド)/ bar(比較)/ hist(分布)/ box(分布+外れ値)/ scatter(相関)/ pie(構成比)/ area(累積)/ kde(密度)
- subplots=Trueで複数のサブプロット、layout=(r,c)でグリッド配置
- スタイルカスタマイズ:style/color/figsize/title/grid/alpha/axhline
- df.plotはAxesオブジェクトを返すため、Matplotlibのメソッドで引き続き調整可能
- 保存:plt.savefig(path, dpi, bbox_inches)
- 戦略:df.plotで素早くドラフトを作成し、Matplotlibで詳細を微調整
📝 練習問題
- 基礎(難易度 ⭐):月次売上のDataFrameを作成し、折れ線グラフ・棒グラフ・円グラフで表示してください。各チャートタイプが同じデータをどのように表現するか比較してみましょう。
- 応用(難易度 ⭐⭐):複数列のDataFrameを作成し、subplots=Trueを使って2x2のサブプロットグリッド(折れ線/棒/箱ひげ/ヒストグラム)を描画してください。タイトルとグリッド線を追加しましょう。
- 挑戦(難易度 ⭐⭐⭐):4つの商品カテゴリの12ヶ月分の売上データをシミュレートしてください。4チャートのレポートを作成しましょう:トレンドの折れ線グラフ、年次棒グラフ、構成比の円グラフ、価格と評価の散布図。結果をPNGファイルとして保存してください。



