基于密度阈值的聚类点
Cluster points based on density threshold
更新了我的问题。见下文。
我有一个散点图,有很多噪音。我只想绘制高于密度阈值的点。
我用gaussian_kde计算了点的密度,但我不知道如何实现阈值。我想过屏蔽点,但是这不行。
thresh = 10
x = x_data
y = y_data
xy = np.vstack([x,y])
z = gaussian_kde(xy)(xy)
x1 = np.ma.masked_where(z > thresh, x) # mask points above threshold
y1 = np.ma.masked_where(z > thresh, y) # mask points above threshold
fig, ax = plt.subplots()
ax.scatter(x, y, c=z, s=10)
我希望绘图的噪音更少,但是当我绘制 x1 和 y1 时没有任何变化。我只想看密度高的点
为了减少噪音,我尝试根据点的密度对点进行聚类。用gausian_kde计算密度。
我制作了一个 3D 散点图来估计分隔集群的阈值。
x = x_data
y = y_data
xy = np.vstack([x,y])
z = gaussian_kde(xy)(xy)
cI_t = 0.0000059
cI_x = np.ma.masked_where(z < cI_t, x).compressed()
cI_y = np.ma.masked_where(z < cI_t, y).compressed()
cII_t = 0.0000165
cII_x = np.ma.masked_where(z < cII_t, x).compressed()
cII_x_1 = cII_x[(cII_y <= 252)]
cII_y = np.ma.masked_where(z < cII_t, y).compressed()
cII_y_1 = cII_y[(cII_y >= 252)]
cIII_t = 0.0000048
cIII_x = np.ma.masked_where(z < cIII_t, x).compressed()
cIII_y = np.ma.masked_where(z < cIII_t, y).compressed()
cIV_t = 0.00003
cIV_x = np.ma.masked_where(z < cIV_t, x).compressed()
cIV_y = np.ma.masked_where(z < cIV_t, y).compressed()
# 3D Density plot
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x, y, z)
plt.show()
# Scatter plot cII and cIV
fig2, ax2 = plt.subplots()
#plt.scatter(cI_x, cI_y)
plt.scatter(cII_x, cII_y)
#plt.scatter(cIII_x, cIII_y)
plt.scatter(cIV_x, cIV_y)
plt.axhline(y=255)
ax2.set_xlim(0,360)
ax2.set_ylim(0,360)
plt.show()
但我知道我只需要 select 来自 cII 集群的顶部蓝点。有没有办法 select 只有蓝线以上的点。 (忽略橙色点,这是 cIV 集群。)
解法:
集群 cII 的示例:我从 x 和 y 数据制作了一个 pandas 数据框,然后根据散点图中的值选择了点。
cII_t = 0.0000165
cII_x = np.ma.masked_where(z < cII_t, x).compressed()
cII_y = np.ma.masked_where(z < cII_t, y).compressed()
cII_df = pd.DataFrame({"x" : cII_x, "y" : c2II_y})
cII_df = cII_df[(cII_df["x"] >= 166) & (cII_df["x"] <= 227) & (cII_df["y"] >= 252) & (c2II_df["y"] <= 336)]
cII_x = cII_df["x"]
cII_y = cII_df["y"]
最终剧情:
更新了我的问题。见下文。
我有一个散点图,有很多噪音。我只想绘制高于密度阈值的点。
我用gaussian_kde计算了点的密度,但我不知道如何实现阈值。我想过屏蔽点,但是这不行。
thresh = 10
x = x_data
y = y_data
xy = np.vstack([x,y])
z = gaussian_kde(xy)(xy)
x1 = np.ma.masked_where(z > thresh, x) # mask points above threshold
y1 = np.ma.masked_where(z > thresh, y) # mask points above threshold
fig, ax = plt.subplots()
ax.scatter(x, y, c=z, s=10)
我希望绘图的噪音更少,但是当我绘制 x1 和 y1 时没有任何变化。我只想看密度高的点
为了减少噪音,我尝试根据点的密度对点进行聚类。用gausian_kde计算密度。
我制作了一个 3D 散点图来估计分隔集群的阈值。
x = x_data
y = y_data
xy = np.vstack([x,y])
z = gaussian_kde(xy)(xy)
cI_t = 0.0000059
cI_x = np.ma.masked_where(z < cI_t, x).compressed()
cI_y = np.ma.masked_where(z < cI_t, y).compressed()
cII_t = 0.0000165
cII_x = np.ma.masked_where(z < cII_t, x).compressed()
cII_x_1 = cII_x[(cII_y <= 252)]
cII_y = np.ma.masked_where(z < cII_t, y).compressed()
cII_y_1 = cII_y[(cII_y >= 252)]
cIII_t = 0.0000048
cIII_x = np.ma.masked_where(z < cIII_t, x).compressed()
cIII_y = np.ma.masked_where(z < cIII_t, y).compressed()
cIV_t = 0.00003
cIV_x = np.ma.masked_where(z < cIV_t, x).compressed()
cIV_y = np.ma.masked_where(z < cIV_t, y).compressed()
# 3D Density plot
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x, y, z)
plt.show()
# Scatter plot cII and cIV
fig2, ax2 = plt.subplots()
#plt.scatter(cI_x, cI_y)
plt.scatter(cII_x, cII_y)
#plt.scatter(cIII_x, cIII_y)
plt.scatter(cIV_x, cIV_y)
plt.axhline(y=255)
ax2.set_xlim(0,360)
ax2.set_ylim(0,360)
plt.show()
但我知道我只需要 select 来自 cII 集群的顶部蓝点。有没有办法 select 只有蓝线以上的点。 (忽略橙色点,这是 cIV 集群。)
解法:
集群 cII 的示例:我从 x 和 y 数据制作了一个 pandas 数据框,然后根据散点图中的值选择了点。
cII_t = 0.0000165
cII_x = np.ma.masked_where(z < cII_t, x).compressed()
cII_y = np.ma.masked_where(z < cII_t, y).compressed()
cII_df = pd.DataFrame({"x" : cII_x, "y" : c2II_y})
cII_df = cII_df[(cII_df["x"] >= 166) & (cII_df["x"] <= 227) & (cII_df["y"] >= 252) & (c2II_df["y"] <= 336)]
cII_x = cII_df["x"]
cII_y = cII_df["y"]
最终剧情: