2012-06-06 2 views
7

На рисунке ниже, взятом из галереи matplotlib, contourf используется для создания 2-го участка под 3d. Мой вопрос в том, можно ли использовать imshow, чтобы сделать то же самое? Я хотел бы, чтобы цвета на 2-м участке были более плавными.Matplotlib: imshow in 3d plot

Создание 2d-графика представляется возможным, потому что contourf принимает аргумент zdir, в то время как я смотрел, а imshow - нет. Это говорит о том, что это невозможно, но почему нет? pcolor также выполнит свою работу, возможно ли это с этим?

ответ

11

Просто укажите уровни = вариант для contourf, например,

from mpl_toolkits.mplot3d import axes3d 
import matplotlib.pyplot as plt,numpy as np 
plt.clf() 
fig = plt.figure(1) 
ax = fig.gca(projection='3d') 
X, Y, Z = axes3d.get_test_data(0.05) 
ax.plot_surface(X, Y, Z, rstride=8, cstride=8, alpha=0.3) 
cset = ax.contourf(X, Y, Z, zdir='z', offset=-100, 
     levels=np.linspace(-100,100,1200),cmap=plt.cm.jet) 
cset = ax.contourf(X, Y, Z, zdir='x', offset=-40, cmap=plt.cm.jet) 
cset = ax.contourf(X, Y, Z, zdir='y', offset=40, cmap=plt.cm.jet) 
ax.set_xlabel('X') 
ax.set_xlim(-40, 40) 
ax.set_ylabel('Y') 
ax.set_ylim(-40, 40) 
ax.set_zlabel('Z') 
ax.set_zlim(-100, 100)  
plt.show() 

The image

+0

Отлично, спасибо. –

+2

Это означает, что для приближения изображения используется более 1200 поверхностей. В наши дни трудно быть векторным бэкэндом: D – pwuertz

3

Чуть больше кода, то sega_sai в ответ, но быстрее и мой опыт намного лучше для более сложных поверхностей.

Используйте plot_surface построить плоскую поверхность, где вы хотите и facecolors цвет его со значениями, которые вы хотите

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

from mpl_toolkits.mplot3d import axes3d 
import matplotlib.pyplot as plt,numpy as np 
plt.clf() 
fig = plt.figure(1) 
ax = fig.gca(projection='3d') 
X, Y, Z = axes3d.get_test_data(0.05) 

ax.plot_surface(X, Y, Z, rstride=8, cstride=8, alpha=0.3) 
cset = ax.contourf(X, Y, Z, zdir='x', offset=-40, cmap=plt.cm.jet) 
cset = ax.contourf(X, Y, Z, zdir='y', offset=40, cmap=plt.cm.jet) 

### strating here: 

# normalize Z to [0..1] 
Z=Z-Z.min() 
Z=Z/Z.max() 

#use zoom to make your data smoother 
from scipy.ndimage.interpolation import zoom 

#make data 5 times smoother 
X=zoom(X,5) 
Y=zoom(Y,5) 
Z=zoom(Z,5) 

#draw a surface at -100, using the facecolors command to color it with the values of Z 
cset = ax.plot_surface(X, Y, np.zeros_like(Z)-100,facecolors=plt.cm.jet(Z),shade=False) 


ax.set_xlabel('X') 
ax.set_xlim(-40, 40) 
ax.set_ylabel('Y') 
ax.set_ylim(-40, 40) 
ax.set_zlabel('Z') 
ax.set_zlim(-100, 100)  
plt.show() 

ready image

Это также затрудняет создание цветной полосы, чтобы:

cb = plt.cm.ScalarMappable(cmap=plt.cm.jet) 
cb.set_array(Z) 
plt.colorbar(cb) 
plt.show() 
Смежные вопросы