2017-02-13 5 views
-1

Я пытаюсь применить colormap к 3D-полигону. Полигон в порядке, отображается в правильном положении. Единственное, что я не могу сделать, это заполнить его градиентом.Заполните треугольник в 3D-графике matplolib с градиентом цвета

Вот мой код:

import matplotlib.pyplot as plt 
from mpl_toolkits.mplot3d import Axes3D 
from matplotlib.colors import LinearSegmentedColormap 
from mpl_toolkits.mplot3d.art3d import Poly3DCollection 

fig = plt.figure() 
ax = Axes3D(fig) 

x = [0,0,0] 
y = [0,1,0] 
z = [0,0,1] 
verts = [zip(x, y,z)] #(0,0,0) (0,1,0) (0,0,1) 

colors = ['red', 'gray', 'gray', 'green'] 
index = [0.0, 0.49, 0.509, 1.0] 
cm = LinearSegmentedColormap.from_list('my_colormap', zip(index, colors)) 

collection = Poly3DCollection(verts, cmap=cm) 
ax.add_collection3d(collection) 
plt.show() 

Может кто-нибудь помочь мне, пожалуйста?

EDIT:

Кроме того, градиент должен выглядеть this

+0

Цветовая палитра отображает числа в цвета. Какие номера вы хотите отобразить здесь? Или чего именно вы пытаетесь достичь? – ImportanceOfBeingErnest

+0

Если вы запустите мой код, он отобразит синий треугольник. Вместо этого я хочу, чтобы этот треугольник был заполнен градиентом. Градиент - это тот, который определен в моем коде. –

+0

Цветовая палитра определена в вашем коде, но нет никаких значений для сопоставления с цветовой схемой. В любом случае здесь вы создаете коллекцию с одним элементом (треугольником), и этот единственный элемент имеет один цвет. – ImportanceOfBeingErnest

ответ

0

Поскольку каждый член коллекции может иметь только один цвет, связанный с ним, вы не можете просто использовать треугольник для достижения градиентной заливки ,

Одним из способов получения градиента в треугольнике является использование plt.contourf.

from mpl_toolkits.mplot3d import axes3d 
import matplotlib.pyplot as plt 
import numpy as np 

fig = plt.figure() 
ax = fig.gca(projection='3d') 

X, Y = np.meshgrid(np.linspace(0,1), np.linspace(0,1)) 
Z = 1.-X-Y 
Z[Z<0] = 0 

cset = ax.contourf(X, Y, Z, zdir='x', levels=np.linspace(0,1),offset=0, cmap=plt.cm.jet) 
ax.set_xlabel('X') 
ax.set_xlim(0, 1) 
ax.set_ylabel('Y') 
ax.set_ylim(0,1) 
ax.set_zlabel('Z') 
ax.set_zlim(0,1)  
plt.show() 

enter image description here

Здесь, использование contourf немного рубить. Чтобы получить градиент в каком-либо другом направлении, вероятно, было бы лучше использовать участок поверхности (plot_surface).

from mpl_toolkits.mplot3d import axes3d 
import matplotlib.pyplot as plt 
import numpy as np 

fig = plt.figure() 
ax = fig.gca(projection='3d') 
points=50 
Y, Z = np.meshgrid(np.linspace(0,1,points), np.linspace(0,1,points)) 
Z = Z*(1-Y) 
color =(1-Y+Z)*0.5 

ax.plot_surface(np.zeros_like(Y), Y, Z, facecolors=plt.cm.jet(color), 
       rcount=points, ccount=points, shade=False) 

ax.set_xlabel('X') 
ax.set_xlim(0, 1) 
ax.set_ylabel('Y') 
ax.set_ylim(0,1) 
ax.set_zlabel('Z') 
ax.set_zlim(0,1)  
plt.show() 

Чтобы получить более гладкую картинку, вы можете увеличить points, но это также может увеличить время значительно рисованию.

enter image description here

+0

Это именно то, что я искал. Большое спасибо @ImportanceOfBeingErnest –

+0

Как обычно, если это отвечает на ваш вопрос, рассмотрите [принятие ответа] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work). Если нет, попробуйте сузить свои требования для кого-то, чтобы дать лучший ответ. – ImportanceOfBeingErnest

+0

Еще одна вещь: можно ли «повернуть» градиент. Я имею в виду, есть градиентные «срезы» в другом «направлении» –

Смежные вопросы