用RGB值对应的标记颜色创建matplotlib 3D散点图

8
我已经使用mahotas将一张图片加载到了numpy数组中。
import mahotas
img = mahotas.imread('test.jpg')

每个像素点在标签中都由一组RGB值表示:
img[1,1] = [254, 200, 189]

我已经制作了一个三维散点图,其中第一轴是R值,第二轴是G值,第三轴是B值。这没有问题:

fig = plt.figure()
ax = fig.add_subplot(111, projection = '3d')
for i in range(1,img.shape[1]+1):
    xs = img[i,1][0]
    ys = img[i,1][1]
    zs = img[i,1][2]
    ax.scatter(xs, ys, zs, c='0.5', marker='o')
ax.set_xlabel('X Label')
ax.set_ylabel('Y Label')
ax.set_zlabel('Z Label')

plt.show()

目前我只是绘制了图片的第一列。

如何通过图像像素的颜色来为每个散点图点着色呢?即我想要根据它们的RGB值来为点着色,但我不确定这是否可行?

1个回答

12

是的,您可以这样做,但需要通过与c参数不同的机制来完成。简而言之,请使用 facecolors=rgb_array


首先,让我解释一下正在发生的事情。 scatter 返回的 Collection 有两个“系统”(缺乏更好的术语)用于设置颜色。

如果使用 c 参数,则会通过 ScalarMappable “系统”设置颜色。这指定应通过将颜色映射到单个变量来控制颜色。(这是任何从 ScalarMappable 继承的对象的 set_array 方法。)

除了 ScalarMappable 系统外,集合的颜色也可以独立设置。在这种情况下,您将使用 facecolors kwarg。


以下是一个快速示例,这些点将具有随机指定的 RGB 颜色:

import matplotlib.pyplot as plt
import numpy as np

x, y = np.random.random((2, 10))
rgb = np.random.random((10, 3))

fig, ax = plt.subplots()
ax.scatter(x, y, s=200, facecolors=rgb)
plt.show()

在此输入图像描述


如何在我的情况下应用它?如何使用每个像素的颜色绘制图形? - Carlos Diego

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接