2012-06-06 11 views
7

Trong ô bên dưới, được lấy từ thư viện của matplotlib, đường viền được sử dụng để tạo một ô 2d bên dưới hình vẽ 3d. Câu hỏi của tôi là, có thể sử dụng imshow để làm điều tương tự không? Tôi muốn các màu trong lô 2d trở nên mượt mà hơn.Matplotlib: imshow trong âm mưu 3d

Làm cho âm mưu 2d có vẻ là có thể vì contourf chấp nhận một đối số zdir, trong khi tôi đã xem và imshow thì không. Điều đó cho thấy rằng điều đó là không thể, nhưng tại sao không? pcolor cũng sẽ nhận được công việc làm, là nó có thể với điều đó?

Trả lời

11

Chỉ cần xác định mức = tùy chọn cho contourf, ví dụ

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

Tuyệt vời, cảm ơn bạn. –

+2

Điều này có nghĩa rằng có hơn 1200 bề mặt được vẽ để ước tính hình ảnh? Thật khó để trở thành một phụ trợ vector trong những ngày này: D – pwuertz

3

Một chút mã dài hơn sau đó câu trả lời sega_sai nhưng nhanh hơn và kinh nghiệm của tôi tốt hơn nhiều cho các bề mặt phức tạp hơn.

Sử dụng plot_surface để vẽ một mặt phẳng mà bạn muốn nó và facecolors tô màu nó bằng giá trị bạn muốn

Bạn có thể cần phải làm cho dữ liệu của bạn mượt mà hơn với zoom scipy của

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

Điều này cũng khiến việc tạo thanh màu trở nên khó khăn hơn một chút, để làm điều đó:

cb = plt.cm.ScalarMappable(cmap=plt.cm.jet) 
cb.set_array(Z) 
plt.colorbar(cb) 
plt.show()