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/968f8d4e7ba6018c1de6cbb1e08051fb6f6198db1e77afc96e6f427bd2cd2e32.png

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

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

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

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

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

df.plot.scatter(x="spam", y="ham", marker="v")
<Axes: xlabel='spam', ylabel='ham'>
../_images/191089f93b11eafa3d2369325163055985b431cd83237faf3d286c3550fc33a3.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/15047cee868f104bf6fb00af7957a040408bcba58b2835583955f97f2bdff22a.png

マーカーの色を変更#

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

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

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

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

カラーマップの指定#

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

df.plot.scatter(x="spam", y="ham", c="egg", colormap='viridis')
<Axes: xlabel='spam', ylabel='ham'>
../_images/63359e23f31d27641b77f80ff3c3cbbe4fb9aecbaa309afaf823be2be2125f2b.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/66448e001a3afe22f4897e308e49e0d176837bbd23f02687edcf2c8df558ea96.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/d2b2f6d1fd1f0b317e2bc300053dc672608fb612988351cb78f1e4f28bf20105.png