2013-03-20 15 views
11

Sto tracciando un grafico a dispersione 3D utilizzando la funzione di dispersione e mplot3d. Sto scegliendo un singolo colore per tutti i punti della trama, ma quando disegnato da matplotlib la trasparenza dei punti è impostata in relazione alla distanza dalla fotocamera. C'è un modo per disabilitare questa funzione?valore alfa di controllo su grafico a dispersione 3D utilizzando Python e matplotlib

Ho provato a impostare l'alpha kwarg su None/1 e anche impostare vmin/vmax su 1 (nel tentativo di forzare il ridimensionamento del colore ad essere un singolo colore solido) senza fortuna. Non ho visto altre possibili opzioni relative a questa impostazione nella documentazione di dispersione.

Grazie!

risposta

11

Non ci sono argomenti che possano controllarlo. Ecco alcuni metodi di hacking.

Disabilita set_edgecolors e set_facecolors metodo, in modo che mplot3d non può aggiornare la parte alpha dei colori:

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

Se si desidera chiamare e set_edgecolorsset_facecolors metodi successive, è possibile eseguire il backup questi due metodi prima di disabilitarli:

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

Questo funziona perfettamente. Grazie! – coderunner

+0

Se mai esistesse una soluzione di programmazione che potesse essere chiamata "sfacciato" .. :) – BenB

6

Se si desidera solo nt per disabilitare la regolazione alfa, è possibile sovrascrivere la funzione zalpha. Ciò ti consentirà di aggiornare i colori nel caso di un grafico interattivo e rimuovere comunque la nebbia di profondità.

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

Questa è la risposta corretta (per le versioni recenti di matplotlib) –

Problemi correlati