2013-06-27 3 views
1

Я делаю поверхностный участок на matplotlib. Мои оси - это x, y и глубина. У меня есть двумерный массив, который имеет значения RGB, а индекс соответствует координате (x, y). Как я могу сделать colormap из этого 2D-массива? Благодарю.Сделать matplotlib colormap из numpy массива

код, который делает Numpy массив:

import Image 
import numpy as np 
def makeImageArray(filename): 
    img = Image.open(filename) 
    a = np.array(img).astype("float32") 
    return a 

Изображение в оттенках серого.

+0

, когда вы говорите, что ваш массив RGB равен 2d, вы включаете измерение вдоль RGB? То есть, это 2d массив пикселей с 1d для цвета или 1d массив пикселей с 1d для цвета? – askewchan

+0

Я просто взял фотографию и преобразовал изображение в двумерный массив numpy. Я не уверен, что спрашивал ваш вопрос, но извините, если мой вопрос был плохо написан. – jsmith

+0

Просто техничность; если у вас обычное цветное изображение, это будет фактически 3d, так как его 'shape' будет чем-то вроде' (600,800,3) 'для трех цветов. Оттенки серого будут «(600 800)». Похоже, ваш массив RGB технически 3d, так как он представляет собой 2-мерное изображение в цвете. – askewchan

ответ

0

Из того, что я собираю для каждой точки (x, y), у вас есть две части информации, высота и цвет. Вы хотите иметь поверхностный график с использованием высоты и по цвету в соответствии с цветом в каждом месте.

Хотя вы можете легко указать custom color maps Я не думаю, что это вам поможет. Что вы думаете о том, что это не так, как цветовая палитра, которая отображает высоту в (x, y) на цвет.

Результат является наиболее очевидным на примере поверхностных участков here

Я считаю, что вы хотите за рамки Matplotlib и может быть сделано только с какой-то хак, который я сомневаюсь, что вы хотите использовать.

Еще вот мое предложение:

import pylab as py 
from mpl_toolkits.mplot3d import Axes3D 
import numpy as np 

X = np.arange(-5, 5, 0.1) 
Y = np.arange(-5, 5, 0.1) 
X, Y = np.meshgrid(X, Y) 
R = np.sqrt(X**2 + Y**2) 
Z = np.sin(R) 

colorise = [((5.0 + X[i][i])/10.0, 0.5, 0.0) for i in xrange((len(X)))] 

ax = py.subplot(111, projection='3d') 
for i in xrange(len(X)): 
    ax.plot(X[i], Y[i], Z[i], "o", color=colorise[i]) 

py.show() 

Это производит следующее: Example

Важно это отображается 3D-поверхности с окраской, не зависит от высоты (это градиент по направлению). Наиболее очевидной проблемой является то, что окраска отдельных точек теряет поверхности matplotlibs, что делает ее болезненно понятной, почему 3D-графика называется проекцией !

Извините, это не очень полезно, надеюсь, что лучшее программное обеспечение существует, или я не знаю о полных функциях matplotlibs.

+0

Для этого вам не нужен явный цикл. на странице, с которой вы связались, есть 3D 'scatter', который принимает массив той же формы, что и ключевое слово color. – askewchan