2015-02-09 17 views
5

Desidero avere i colori corrispondenti a una mappa di colori nella trama del mio quiver 3d. La versione 2d del grafico ha una matrice opzionale che viene utilizzata per mappare i colori alle frecce. Come posso creare lo stesso effetto nella versione 3D?Aggiunta di colori a un grafico del tremito 3D in matplotlib

+0

Hai provato a passarlo alla trama del quiver come argomento di parole chiave ('colors')? http://matplotlib.org/mpl_toolkits/mplot3d/tutorial.html#quiver suggerisce di passare parola chiave args a 'LineCollection', che prende' colors' come uno dei suoi argomenti. –

+0

Oh, sembra che potrebbe essere un po 'più complicato di così, dal momento che 'colors' deve essere una lista di tuple RGBA. Tuttavia, se sai come mappare i colori ai tuoi punti, forse potresti generare l'elenco. Penso che guardare le routine della mappa dei colori potrebbe essere utile: http://matplotlib.org/api/cm_api.html#module-matplotlib.cm –

+0

Potrebbe valere la pena aprire un problema su GH che segnala questo problema. – tacaswell

risposta

5

I lotti di faretre 3D sono una caratteristica nuova di zecca in 1,4 (e la sua documentazione) potrebbe essere ancora un po 'approssimativa ai bordi. In questo caso possiamo provare a usare il fatto che la faretra è implementata come LineCollection che (eventualmente) eredita da ScalarMappable che significa che sa cos'è una mappa di colori e l'artista restituito ha il metodo set_array.

Sulla base dei documenti here

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

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

x, y, z = np.meshgrid(np.arange(-0.8, 1, 0.2), 
         np.arange(-0.8, 1, 0.2), 
         np.arange(-0.8, 1, 0.8)) 

u = np.sin(np.pi * x) * np.cos(np.pi * y) * np.cos(np.pi * z) 
v = -np.cos(np.pi * x) * np.sin(np.pi * y) * np.cos(np.pi * z) 
w = (np.sqrt(2.0/3.0) * np.cos(np.pi * x) * np.cos(np.pi * y) * 
    np.sin(np.pi * z)) 

q = ax.quiver(x, y, z, u, v, w, length=0.1, cmap='Reds', lw=2) 
q.set_array(np.random.rand(np.prod(x.shape))) 

plt.show() 

enter image description here

Tuttavia, noterete i teste sono di un colore diverso rispetto al dell'albero che è a causa di un dettaglio di implementazione del modo in cui è implementato ogni parte è disegnata come se fosse una propria linea.

Utilizzare direttamente le funzioni Norm e la mappa dei colori e passare il risultato a colors potrebbe essere un corso migliore.

+0

Che tipo di argomento * richiede * i colori?Avrei indovinato un array dimensionale nxmxkx3 o nxmxkx4, ma non sembra funzionare. –

1

È possibile uso colors argomento per specificare i colori personalizzati per ogni freccia, anche se il modo per farlo non è affatto straight-forward (come per matplotlib 2.0.0). Ho specificato in this issue la logica di come viene effettivamente disegnata la trama del quiver e una soluzione per specificare la colorazione. È possibile controllare this gist per un semplice esempio che può generare un grafico simile a questo: custom coloring of matplotlib 3D quiver

In sintesi, ecco i passi da seguire:

  1. si supponga di avere una lista (di dimensioni x * y * z) di 3-tuple (o 4-tuple per RGBA) che specificano i valori RGB (tra 0 ~ 1) di ciascun vettore da disegnare.
  2. filtra le tuple RGB (o RGBA) corrispondenti ai vettori di lunghezza 0 poiché non verranno disegnati in realtà.
  3. let [color_1, color_2, ..., color_n] essere la lista ottenuta dopo il passaggio 2, è necessario specificare colors=[color_1, color_2, ..., color_n, color_1, color_1, color_2, color_2, ..., color_n, color_n] poiché in realtà la parte "-" (costituita da 1 riga) di tutte le frecce diverse da zero "->" verrà disegnata per prima, quindi viene il ">" parte (composta da 2 righe).

Spero che questo aiuti.

Problemi correlati