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")<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 | 説明 |
|---|---|
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'>
マーカーの色を変更¶
マーカーの色は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()