Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Pandasの散布図

公開日 2024-08-18

PandasのDataFrameで散布図をプロットする方法は、以下の2つがあります。

  • plot()メソッドにkind='scatter'オプションを渡す。

  • plot.scatter()メソッドを使う(メソッドチェーン)。

両者にほぼ違いはありません。この記事では後者を使用します。 なお、PandasのSeriesでは散布図をプロットできません(系列が1つしかないため)。

簡単な例

pandas.DataFrameで散布図をプロットする簡単な例を以下に示します。 plot.scatter()メソッドのx引数に横軸方向のカラム名、y引数に縦軸方向のカラム名をそれぞれ与えます。

import pandas as pd

df = pd.DataFrame(
    [[1, 2, 1], [3, 1, 2], [2, 4, 3], [2, 3, 4]],
    columns=["spam", "ham", "egg"]
)

display(df)
df.plot.scatter(x="spam", y="ham")
Loading...
<Axes: xlabel='spam', ylabel='ham'>
<Figure size 640x480 with 1 Axes>

plot(), plot.scatter()の各メソッドのオプションについては、Pandas グラフ作成の共通設定を参照して下さい。

マーカーの大きさ・形状を変更

マーカーの大きさはsオプションで指定できます。

df.plot.scatter(x="spam", y="ham", s=200)
<Axes: xlabel='spam', ylabel='ham'>
<Figure size 640x480 with 1 Axes>

マーカーの形状はmarkerオプションで指定できます。

df.plot.scatter(x="spam", y="ham", marker="v")
<Axes: xlabel='spam', ylabel='ham'>
<Figure size 640x480 with 1 Axes>

主なmarkerオプションを以下の表に示します。

marker説明
o
v下向き三角
^上向き三角
<左向き三角
>右向き三角
s四角形(square)
p五角形(pentagon)
++記号
xx記号
Dダイヤモンド

その他に指定可能なマーカーの形状については、以下の公式ページを参照ください。

matplotlib.markers — Matplotlib documentation

マーカーの枠線の太さ・色も変更できます。指定できるオプション名を以下の表に示します。

オプション説明
linewidthsマーカー枠線の太さ
edgecolorsマーカー枠線の色

これらのオプションを使用した例を以下に示します。枠線の色をオレンジ、枠線の太さを3としています。

df.plot.scatter(x="spam", y="ham", s=200, edgecolors="orange", linewidths=3)
<Axes: xlabel='spam', ylabel='ham'>
<Figure size 640x480 with 1 Axes>

マーカーの色を変更

マーカーの色はcオプションで指定できます。cオプションで指定できる色の詳細は、Matplotlib 色の書式を参考にして下さい。

df.plot.scatter(x="spam", y="ham", c="green")
<Axes: xlabel='spam', ylabel='ham'>
<Figure size 640x480 with 1 Axes>

また、alphaオプションで透明度を変更できます。0から1の範囲を取り、値が小さいほど透明に近づきます。

df.plot.scatter(x="spam", y="ham", alpha=0.5)
<Axes: xlabel='spam', ylabel='ham'>
<Figure size 640x480 with 1 Axes>

カラーマップの指定

散布図の各点の色を、DataFrameのカラムの値に合わせて指定できます。cにカラム名を、colormapにカラーマップを指定します。

df.plot.scatter(x="spam", y="ham", c="egg", colormap='viridis')
<Axes: xlabel='spam', ylabel='ham'>
<Figure size 640x480 with 2 Axes>

指定可能なカラーマップについては、Matplotlibのカラーマップを参照下さい。

また、表示するカラーマップの範囲を固定したい場合、最小値と最大値をそれぞれvmin, vmaxで指定します。

df.plot.scatter(x="spam", y="ham", c="egg", colormap='viridis', vmin=-6, vmax=6)
<Axes: xlabel='spam', ylabel='ham'>
<Figure size 640x480 with 2 Axes>

複数系列の散布図

散布図に系列を追加したい場合、少し工夫が必要になります。 pandas.DataFrameplot.scatter()メソッド自体には複数系列を扱う機能がありません。 そこで、Matplotlibと連携させます。

以下に例を示します。 DataFrameを2つ用意し、それぞれMatplotlibで作成したグラフにプロットします。 具体的には、Axesオブジェクト(以下のaxes)を、各DataFrameplot.scatter()メソッドのax引数に渡します。 さらに、cオプションで色を変更し、labelオプションで凡例に表示する系列名を与えます。

import matplotlib.pyplot as plt

# 新しいDataFrameを用意します(緑色でプロットする)
new_df = pd.DataFrame(
    [[1, 1], [2, 2], [3, 3], [4, 4]],
    columns=["spam", "ham"]
)

fig, axes = plt.subplots()
df.plot.scatter(x="spam", y="ham", ax=axes, c="blue", label="df")
new_df.plot.scatter(x="spam", y="ham", ax=axes, c="green", label="new_df")
axes.legend()
plt.show()
<Figure size 640x480 with 1 Axes>