1. ホーム
  2. python

[解決済み] matplotlib で密度によって色分けされた散布図を作るには?

2022-10-09 23:34:50

質問

各点が、近くの点の空間密度によって色分けされている散布図を作りたい。

私は非常に似たような質問に出くわしましたが、これはRを使用してこの例を示しています。

R散布図: シンボルの色は重なった点の数を表す

pythonでmatplotlibを使用して同様のことを達成する最善の方法は何ですか?

どのように解決するのですか?

に加えて hist2d または hexbin のように、@askewchan が提案したように、リンク先の質問で受け入れられた回答が使用しているのと同じ方法を使用することができます。

そうしたいのであれば

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import gaussian_kde

# Generate fake data
x = np.random.normal(size=1000)
y = x * 3 + np.random.normal(size=1000)

# Calculate the point density
xy = np.vstack([x,y])
z = gaussian_kde(xy)(xy)

fig, ax = plt.subplots()
ax.scatter(x, y, c=z, s=100)
plt.show()

<イグ

点を密度順にプロットして、最も密度の高い点が常に上になるようにしたい場合(リンク先の例と同様)、z値で並べ替えればよいでしょう。 また、見た目が少し良くなったので、ここでは小さいマーカーサイズを使用することにします。

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import gaussian_kde

# Generate fake data
x = np.random.normal(size=1000)
y = x * 3 + np.random.normal(size=1000)

# Calculate the point density
xy = np.vstack([x,y])
z = gaussian_kde(xy)(xy)

# Sort the points by density, so that the densest points are plotted last
idx = z.argsort()
x, y, z = x[idx], y[idx], z[idx]

fig, ax = plt.subplots()
ax.scatter(x, y, c=z, s=50)
plt.show()

<イグ