2013-03-20 6 views
11

Ich zeichne ein 3D-Streudiagramm mit der Funktion Scatter und mplot3d. Ich wähle eine einzelne Farbe für alle Punkte in der Zeichnung, aber wenn sie von Matplotlib gezeichnet wird, wird die Transparenz der Punkte relativ zu der Entfernung von der Kamera eingestellt. Gibt es eine Möglichkeit, diese Funktion zu deaktivieren?Steuern von Alpha-Wert auf 3D-Streudiagramm mit Python und Matplotlib

Ich habe versucht, die Alpha-Kwarg zu None/1 und setzen Sie auch Vmin/Vmax auf 1 (in einem Versuch, die Farbskalierung zu einer festen Farbe zu zwingen) ohne Glück. Ich habe in der Scatter-Dokumentation keine anderen Optionen für diese Einstellung gefunden.

Danke!

Antwort

11

Es gibt keine Argumente, die dies steuern können. Hier ist eine Hack-Methode.

Disable set_edgecolors und set_facecolors Methode, so dass mplot3d nicht die Alpha-Teil der Farben aktualisieren:

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() 
später

enter image description here

Wenn Sie anrufen möchten set_edgecolors und set_facecolors Methoden, können Sie ein Backup diese zwei Methoden, bevor sie deaktiviert werden:

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

Das funktioniert perfekt. Vielen Dank! – coderunner

+0

Wenn es jemals eine Programmierlösung gab, die man "frech" nennen könnte .. :) – BenB

6

Wenn Sie nur wa Um die Alpha-Anpassung zu deaktivieren, können Sie die Zalpha-Funktion überschreiben. Dadurch können Sie die Farben im Falle eines interaktiven Plots aktualisieren und den Tiefennebel entfernen.

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

Dies ist die richtige Antwort (für die letzten Matplotlib-Versionen) –

Verwandte Themen