Pandasの散布図#

公開日

参考

Pandasを使わずMatplotlib単体で散布図を出力する場合、Matplotlibの散布図を参照ください。

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")
spam ham egg
0 1 2 1
1 3 1 2
2 2 4 3
3 2 3 4
<Axes: xlabel='spam', ylabel='ham'>
../_images/42316be1b78d7d35f32d9cc0fad47466999afb78a1f343158e10943982cf563a.png

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

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

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

df.plot.scatter(x="spam", y="ham", s=200)
<Axes: xlabel='spam', ylabel='ham'>
../_images/6fc6de1969b523374319fcc122daba17a8142bb3a9f101a685eebba5cdc6a5ea.png

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

df.plot.scatter(x="spam", y="ham", marker="v")
<Axes: xlabel='spam', ylabel='ham'>
../_images/24d3a186ed72a9f9fa01d0f2f891f2b84da7ff7fd7d69b75bd5756162884b2d6.png

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

marker

説明

o

v

下向き三角

^

上向き三角

<

左向き三角

>

右向き三角

s

四角形(square)

p

五角形(pentagon)

+

+記号

x

x記号

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'>
../_images/2d9302b693431203d8f56900340c32139f89b56b254b4b95b7c9e6864f8a01df.png

マーカーの色を変更#

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

df.plot.scatter(x="spam", y="ham", c="green")
<Axes: xlabel='spam', ylabel='ham'>
../_images/42c0646ae2d350a5190f0e9eb335455ad5f654888c4b6c3b2e0c15ad93e637cc.png

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

df.plot.scatter(x="spam", y="ham", alpha=0.5)
<Axes: xlabel='spam', ylabel='ham'>
../_images/9ce951fe84255503a50c2744ecf88b80f381f8dcf22379f95c8765603f6d3537.png

カラーマップの指定#

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

df.plot.scatter(x="spam", y="ham", c="egg", colormap='viridis')
<Axes: xlabel='spam', ylabel='ham'>
../_images/a141b543f2a136aeea81f696a0a09f5ea140f8f3e8aebdc74023406ceaf97ac8.png

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

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

df.plot.scatter(x="spam", y="ham", c="egg", colormap='viridis', vmin=-6, vmax=6)
<Axes: xlabel='spam', ylabel='ham'>
../_images/29a75adadd66f54425182cacab3a36443dd94281ac5a923fe8c467ff9b0e14f5.png

複数系列の散布図#

散布図に系列を追加したい場合、少し工夫が必要になります。 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()
../_images/ce67da2468dc253c050f2b19c267073c26d29a71766c3e3e832791d16dffedea.png