首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在matplotlib三维散点图上表示密度信息

如何在matplotlib三维散点图上表示密度信息
EN

Stack Overflow用户
提问于 2018-12-18 11:59:56
回答 1查看 1.2K关注 0票数 4

我正在尝试将图像中的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)更大的气泡,尽管我觉得编码为颜色信息的密度信息在视觉上更吸引人

EN

回答 1

Stack Overflow用户

发布于 2018-12-18 23:15:11

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

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

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

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

代码语言:javascript
复制
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

这是一个玩具图像的结果

代码语言:javascript
复制
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应该基本上每列显示一种颜色,沿行重复显示。所以每个点都应该有相同的颜色(并且它会有合适的带宽)。

渐变+噪声

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53826201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档