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
risposta
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()
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.
Che tipo di argomento * richiede * i colori?Avrei indovinato un array dimensionale nxmxkx3 o nxmxkx4, ma non sembra funzionare. –
È 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:
In sintesi, ecco i passi da seguire:
- 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.
- filtra le tuple RGB (o RGBA) corrispondenti ai vettori di lunghezza 0 poiché non verranno disegnati in realtà.
- let
[color_1, color_2, ..., color_n]
essere la lista ottenuta dopo il passaggio 2, è necessario specificarecolors=[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.
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. –
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 –
Potrebbe valere la pena aprire un problema su GH che segnala questo problema. – tacaswell