Python 3.x 如何在matplotlib三维散点图上表示密度信息

Python 3.x 如何在matplotlib三维散点图上表示密度信息,python-3.x,matplotlib,data-visualization,mplot3d,scatter3d,Python 3.x,Matplotlib,Data Visualization,Mplot3d,Scatter3d,我试图把图像中的r、g、b通道绘制成三维散点图 当我有一个黑白图像时,这很有效,因为我得到的散点图在散点图的两端只有两个不同的簇 然而,对于彩色图像,散点图在视觉上没有多大意义,因为在图像的颜色空间中有对应于许多点的r、g、b值 因此,我最终得到了如下所示的图像- 我想实现的是以某种方式表示密度信息。例如,如果对应于(255255)的点数为1000,而对应于(0,0,0)的点数仅为500,则我希望(255255)为深红色,(0,0,0)为黄色/橙色 如何在matplotlib中实现这一点?虽然

我试图把图像中的r、g、b通道绘制成三维散点图

当我有一个黑白图像时,这很有效,因为我得到的散点图在散点图的两端只有两个不同的簇

然而,对于彩色图像,散点图在视觉上没有多大意义,因为在图像的颜色空间中有对应于许多点的r、g、b值

因此,我最终得到了如下所示的图像-

我想实现的是以某种方式表示密度信息。例如,如果对应于(255255)的点数为1000,而对应于(0,0,0)的点数仅为500,则我希望(255255)为深红色,(0,0,0)为黄色/橙色


如何在matplotlib中实现这一点?虽然我觉得编码为颜色信息的密度信息在视觉上会更吸引人,但我也可以接受某种气泡效果,其中(255255255)表示为比(0,0,0)更大的气泡。它还远远不够完美,结果在很大程度上取决于估计参数(
bw\u方法
)。也许有一种更简单的方法,可以使用
np.unique
来获得每种独特颜色的频率

其思想是将颜色密度分布估计为多元高斯混合,并将其用作散点图的颜色图

这是一个有点慢,任何严重的,但我认为它提供了足够小的图像很好的结果。也许一些基于FFT+卷积的估计方法可以更快

让我们看一些代码。没什么特别的:它会像
gaussian_kde
喜欢的那样对图像数据进行展平和重塑,并返回RGB和密度分量。您可以使用
bw_方法
查看结果如何变化,得到的密度越大,越平滑

from scipy.stats import gaussian_kde

def img_to_rgbk(img, bw=0.1):
    rgb = img.reshape(-1, 3).T
    k = gaussian_kde(rgb, bw_method=bw)(rgb)
    r, g, b = rgb

    return r, g, b, k
以下是玩具图片的结果

img = chelsea()[100:200, 100:200]

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

r, g, b, k = img_to_rgbk(img, bw=0.5)
ax.scatter(r, g, b, c=k, alpha=0.2)
请注意,
c=k
用于将贴图标记颜色设置为密度信息,
alpha
需要通过云层看到一点

切尔西

随机颜色

坡度 请注意,这里您可以看到错误的带宽选择可能会产生误导。一个足够小的
bw_方法
应该基本上显示每列一种颜色,沿行重复。所以每个点都应该有相同的颜色(并且它会有合适的带宽)。

梯度+噪声 这里有更好的带宽和一些噪声来传播颜色。请注意,白色区域周围的密度较大,无噪波图中的不连续性成为密度最大值。