imshow
può richiedere un array di voci [r, g, b]. In questo modo puoi convertire i valori assoluti in intensità e fasi - in tonalità.
Userò come esempio numeri complessi, perché per esso ha più senso. Se necessario, è sempre possibile aggiungere gli array numpy
Z = X + 1j * Y
.
Quindi per i tuoi dati Z
puoi utilizzare ad es.
imshow(complex_array_to_rgb(Z))
dove (EDIT: ha reso più veloce e più bello grazie a this suggestion)
def complex_array_to_rgb(X, theme='dark', rmax=None):
'''Takes an array of complex number and converts it to an array of [r, g, b],
where phase gives hue and saturaton/value are given by the absolute value.
Especially for use with imshow for complex plots.'''
absmax = rmax or np.abs(X).max()
Y = np.zeros(X.shape + (3,), dtype='float')
Y[..., 0] = np.angle(X)/(2 * pi) % 1
if theme == 'light':
Y[..., 1] = np.clip(np.abs(X)/absmax, 0, 1)
Y[..., 2] = 1
elif theme == 'dark':
Y[..., 1] = 1
Y[..., 2] = np.clip(np.abs(X)/absmax, 0, 1)
Y = matplotlib.colors.hsv_to_rgb(Y)
return Y
Così, ad esempio:
Z = np.array([[3*(x + 1j*y)**3 + 1/(x + 1j*y)**2
for x in arange(-1,1,0.05)] for y in arange(-1,1,0.05)])
imshow(complex_array_to_rgb(Z, rmax=5), extent=(-1,1,-1,1))
imshow(complex_array_to_rgb(Z, rmax=5, theme='light'), extent=(-1,1,-1,1))
Questo è un po 'di non risposta, ma 'imshow' richiede una matrice' NxMx3' o 'NxMx4' in modo da poter eseguire manualmente la mappatura dei colori. Sono d'accordo che sarebbe utile. Potresti ottenere un po 'di trazione classificando in subordine "Normalizza" e disponendo la tua mappa dei colori in modo molto intelligente.Penso che l'ovvia estensione sia lasciare che le mappe dei colori prendano argomenti complessi, ma probabilmente è molto lavoro. – tacaswell
Non sono sicuro di come farlo, ma sei sicuro che sia una buona idea? occhio umano non è molto bravo a stimare i valori dal colore (e la colormap a getto è un famigerato criminale). Usarne due allo stesso tempo può essere un vero killer. Vi consiglio caldamente di leggere 'http: // www.research.ibm.com/people/l/lloydt/color/color.HTM'. – EnricoGiampieri
@EnricoGiampieri: No, non sono sicuro che sia una buona idea, ma voglio provarlo. L'intento è quello di mostrare la magnitudine come leggerezza percettiva e l'angolo di fase come tonalità percettiva (non solo il tipo HSV), con il massimo della crominanza per renderli il più distinti possibile. Gli angoli di fase in aree di bassa magnitudo sono generalmente casuali e dovrebbero comunque essere mascherati. In questo caso saranno mascherati dall'oscurità. [Sì, mi lamento sempre di 'jet'.] (Https://github.com/matplotlib/matplotlib/issues/875): D – endolith