【问题标题】:How to represent density information on a matplotlib 3-D scatter plot如何在 matplotlib 3-D 散点图上表示密度信息
【发布时间】:2019-05-18 11:13:53
【问题描述】:

我正在尝试将图像中的 r、g、b 通道绘制为 3-D 散点图。

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

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

所以我最终得到了如下所示的图像 -

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

我如何在 matplotlib 中实现这一点?我也可以接受某种气泡效果,其中 (255,255,255) 表示为比 (0,0,0) 更大的气泡,尽管我觉得编码为颜色信息的密度信息会更具视觉吸引力

【问题讨论】:

    标签: python-3.x matplotlib data-visualization mplot3d scatter3d


    【解决方案1】:

    这是使用高斯 KDE 的尝试。它仍然远非完美,结果很大程度上取决于估计参数 (bw_method)。也许有一种更简单的方法,也许是使用np.unique 来获取每种独特颜色的频率。

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

    对于任何严肃的事情来说它有点慢,但我认为它可以用足够小的图像给出很好的结果。也许一些基于 FFT+卷积的估计方法会更快。

    让我们看一些代码。没什么特别的:它以gaussian_kde 喜欢的方式展平和重塑图像数据,并返回 RGB 和密度分量。你可以试试bw_method,看看结果如何变化,密度越大,你得到的密度就越平滑。

    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_method 应该基本上每列显示一种颜色,沿行重复。因此,每个点都应该具有相同的颜色(并且具有正确的带宽)。

    渐变+噪点

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-05
      • 2013-07-31
      • 2017-05-24
      • 1970-01-01
      • 1970-01-01
      • 2019-01-22
      • 1970-01-01
      相关资源
      最近更新 更多