2013-03-20 17 views
11

Wykreślam trójwymiarowy wykres punktowy za pomocą funkcji scatter i mplot3d. Wybieram jeden kolor dla wszystkich punktów na wykresie, ale po narysowaniu przez matplotlib przezroczystość punktów jest ustawiona w stosunku do odległości od kamery. Czy jest jakiś sposób na wyłączenie tej funkcji?Sterowanie wartością alfa na wykresie rozproszenia 3D za pomocą Pythona i matplotlib

Próbowałem ustawić alfa kwarg na None/1, a także ustawić vmin/vmax na 1 (aby zmusić skalowanie kolorów do uzyskania jednolitego koloru) bez powodzenia. Nie widziałem żadnych innych prawdopodobnych opcji związanych z tym ustawieniem w dokumentacji rozproszonej.

Dzięki!

Odpowiedz

11

Nie ma argumentów, które mogłyby to kontrolować. Oto kilka metod hackowania.

Wyłącz set_edgecolors i set_facecolors metoda, tak że nie można zaktualizować mplot3d część alfa kolorów:

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

Jeśli chcesz zadzwonić set_edgecolors i set_facecolors metody Później można te zapasowej dwie metody przed ich wyłączeniem:

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

Działa to doskonale. Dzięki! – coderunner

+0

Jeśli kiedykolwiek istniało rozwiązanie programistyczne, które można by nazwać "bezczelne" .. :) – BenB

6

Jeśli tylko Aby wyłączyć opcję alfa, możesz zastąpić funkcję zalpha. Pozwoli to zaktualizować kolory w przypadku interaktywnej fabuły i nadal usuwać głębokość mgły.

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

To jest poprawna odpowiedź (dla najnowszych wersji matplotlib) –

Powiązane problemy