2012-06-06 19 views
7

matplotlib की गैलरी से ली गई साजिश में, contourf का उपयोग 3 डी एक के नीचे 2 डी प्लॉट बनाने के लिए किया जाता है। मेरा सवाल है, क्या एक ही काम करने के लिए imshow का उपयोग करना संभव है? मैं 2 डी प्लॉट में रंग चिकना होना चाहता हूं।Matplotlib: 3 डी प्लॉट में imshow

2 डी प्लॉट बनाना संभव प्रतीत होता है क्योंकि contourf एक zdir तर्क स्वीकार करता है, जबकि मैंने देखा और imshow नहीं करता है। इससे पता चलता है कि यह संभव नहीं है, लेकिन क्यों नहीं? पिक्सर को भी काम मिल जाएगा, क्या यह संभव है?

उत्तर

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 से अधिक सतहें खींची गई हैं? इन दिनों वेक्टर बैकएंड होना मुश्किल है: डी – 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()