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'>

plot()
, plot.scatter()
の各メソッドのオプションについては、Pandas グラフ作成の共通設定を参照して下さい。
マーカーの大きさ・形状を変更#
マーカーの大きさはs
オプションで指定できます。
df.plot.scatter(x="spam", y="ham", s=200)
<Axes: xlabel='spam', ylabel='ham'>

マーカーの形状はmarker
オプションで指定できます。
df.plot.scatter(x="spam", y="ham", marker="v")
<Axes: xlabel='spam', ylabel='ham'>

主なmarker
オプションを以下の表に示します。
marker |
説明 |
---|---|
|
丸 |
|
下向き三角 |
|
上向き三角 |
|
左向き三角 |
|
右向き三角 |
|
四角形(square) |
|
五角形(pentagon) |
|
+記号 |
|
x記号 |
|
ダイヤモンド |
その他に指定可能なマーカーの形状については、以下の公式ページを参照ください。
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'>

マーカーの色を変更#
マーカーの色はc
オプションで指定できます。c
オプションで指定できる色の詳細は、Matplotlib 色の書式を参考にして下さい。
df.plot.scatter(x="spam", y="ham", c="green")
<Axes: xlabel='spam', ylabel='ham'>

また、alpha
オプションで透明度を変更できます。0
から1
の範囲を取り、値が小さいほど透明に近づきます。
df.plot.scatter(x="spam", y="ham", alpha=0.5)
<Axes: xlabel='spam', ylabel='ham'>

カラーマップの指定#
散布図の各点の色を、DataFrameのカラムの値に合わせて指定できます。c
にカラム名を、colormap
にカラーマップを指定します。
df.plot.scatter(x="spam", y="ham", c="egg", colormap='viridis')
<Axes: xlabel='spam', ylabel='ham'>

指定可能なカラーマップについては、Matplotlibのカラーマップを参照下さい。
また、表示するカラーマップの範囲を固定したい場合、最小値と最大値をそれぞれvmin
, vmax
で指定します。
df.plot.scatter(x="spam", y="ham", c="egg", colormap='viridis', vmin=-6, vmax=6)
<Axes: xlabel='spam', ylabel='ham'>

複数系列の散布図#
散布図に系列を追加したい場合、少し工夫が必要になります。
pandas.DataFrame
のplot.scatter()
メソッド自体には複数系列を扱う機能がありません。
そこで、Matplotlibと連携させます。
以下に例を示します。
DataFrame
を2つ用意し、それぞれMatplotlibで作成したグラフにプロットします。
具体的には、Axes
オブジェクト(以下のaxes
)を、各DataFrame
のplot.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()
