404 Not Found

404 Not Found


nginx

【Pandasデータ可視化】df.plotでチャート作成完全ガイド

生の数値をじっと眺めたい人はいません。上司はチャートを求め、報告書にはチャートが必要で、プレゼン資料にもチャートが欠かせません。Pandasのdf.plotは、内部でMatplotlibエンジンを活用し、たった1行でチャートを生成できます。本セクションでは、最もよく使われる8種類のチャートタイプ、サブプロットのレイアウト、スタイルカスタマイズを解説し、どんなDataFrameでもすばやくビジュアルレポートに変換できるようにします。

⚠️ 注意: 以下のコードは、matplotlibがインストールされたローカルのPython環境で実行してください。

1. 学習内容



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) ▶ チャート選択の判断ツリー

100%
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を設定して区別します。

📖 まとめ


📝 練習問題

  1. 基礎(難易度 ⭐):月次売上のDataFrameを作成し、折れ線グラフ・棒グラフ・円グラフで表示してください。各チャートタイプが同じデータをどのように表現するか比較してみましょう。
  2. 応用(難易度 ⭐⭐):複数列のDataFrameを作成し、subplots=Trueを使って2x2のサブプロットグリッド(折れ線/棒/箱ひげ/ヒストグラム)を描画してください。タイトルとグリッド線を追加しましょう。
  3. 挑戦(難易度 ⭐⭐⭐):4つの商品カテゴリの12ヶ月分の売上データをシミュレートしてください。4チャートのレポートを作成しましょう:トレンドの折れ線グラフ、年次棒グラフ、構成比の円グラフ、価格と評価の散布図。結果をPNGファイルとして保存してください。

← 前へ:ウィンドウ関数 · 次へ:パフォーマンス最適化 →

Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%