2015-04-01 591 views
6

我已經使用mahotas將圖片加載到numpy數組中。matplotlib 3D散點圖,標記顏色對應於RGB值

img[1,1] = [254, 200, 189] 

我已經作出的R值的3D散點圖上的一個軸,G值上的第二軸和B值上:

import mahotas 
img = mahotas.imread('test.jpg') 

img每個像素由RGB值的陣列表示的第三軸。這是沒有問題的:

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值對點進行着色,但我不確定這是否可能?

回答

11

是的,你可以做到這一點,但它需要通過一個單獨的機制來完成,而不是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() 

enter image description here