2013-03-20 6 views
11

का उपयोग कर 3 डी स्कैटर प्लॉट पर अल्फा मान को नियंत्रित करना मैं फ़ंक्शन स्कैटर और mplot3d का उपयोग करके 3 डी स्कैटर प्लॉट की योजना बना रहा हूं। मैं साजिश में सभी बिंदुओं के लिए एक रंग चुन रहा हूं, लेकिन जब मैटलप्लिब द्वारा खींचा जाता है तो बिंदुओं की पारदर्शिता कैमरे से दूरी के सापेक्ष सेट होती है। क्या इस सुविधा को अक्षम करने का कोई तरीका है?पाइथन और matplotlib

मैंने अल्फा क्वर्ग को किसी भी/1 पर सेट करने का प्रयास नहीं किया है और बिना किसी भाग्य के रंगीन स्केलिंग को ठोस एकल रंग होने के लिए 1 (vmin/vmax को सेट करने के लिए) सेट किया है। मुझे स्कैटर दस्तावेज़ में इस सेटिंग से संबंधित कोई अन्य संभावित विकल्प नहीं दिखाई दिए।

धन्यवाद!

उत्तर

11

कोई तर्क नहीं है जो इसे नियंत्रित कर सकता है। यहां कुछ हैक विधि है।

अक्षम set_edgecolors और set_facecolors विधि, ताकि mplot3d रंग की अल्फा हिस्सा अद्यतन नहीं कर सकते:

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

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

x = np.random.sample(20) 
y = np.random.sample(20) 
z = np.random.sample(20) 
s = ax.scatter(x, y, z, c="r") 
s.set_edgecolors = s.set_facecolors = lambda *args:None 

ax.legend() 
ax.set_xlim3d(0, 1) 
ax.set_ylim3d(0, 1) 
ax.set_zlim3d(0, 1) 

plt.show() 

enter image description here

आप set_edgecolors और set_facecolors तरीकों बाद में फोन चाहते हैं, आप कर सकते हैं बैकअप इन उन्हें अक्षम करने से पहले दो विधियां:

s._set_facecolors, s._set_edgecolors = s.set_facecolors, s.set_edgecolors 
+0

यह पूरी तरह से काम करता है। धन्यवाद! – coderunner

+0

यदि कभी प्रोग्रामिंग समाधान होता है जिसे "गाल" कहा जा सकता है .. :) – BenB

6

यदि आप केवल वा अल्फा समायोजन को अक्षम करने के लिए, आप zalpha फ़ंक्शन को ओवरराइट कर सकते हैं। यह आपको एक इंटरैक्टिव प्लॉट के मामले में रंग अपडेट करने की अनुमति देगा और अभी भी गहराई कोहरे को हटा देगा।

from mpl_toolkits.mplot3d import * 
import numpy as np 
import matplotlib.pyplot as plt 
plt.ion() 

art3d.zalpha = lambda *args:args[0] 

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

x = np.random.sample(20) 
y = np.random.sample(20) 
z = np.random.sample(20) 
s = ax.scatter(x, y, z, c="r") 

ax.legend() 
ax.set_xlim3d(0, 1) 
ax.set_ylim3d(0, 1) 
ax.set_zlim3d(0, 1) 

plt.show() 
4
ax.scatter(x, y, z, depthshade=0) 
+2

यह सही उत्तर है (हाल के matplotlib संस्करणों के लिए) –