2016-05-30 27 views
5

Sto tentando di plottare i valori hsv utilizzando imshow in matplotlib. Il problema è che il metodo che sto usando restituisce una tupla con tre valori come previsto per hsv ma imshow lo interpreta come rgb. C'è un modo per dire allo imshow che i valori sono valori hsv?Rappresentazione grafica dei valori hsv con imshow

Ecco il mio codice:

import matplotlib.pyplot as plt 
import numpy as np 
import matplotlib.colors as mcolors 


def G(x, y): 
    s = x + 1j*y 
    return (s+2)/(s**2 + s + 1) 

x = np.linspace(-3, 3, 1000) 
y = np.linspace(-3, 3, 1000) 

xx, yy = np.meshgrid(x, y) 
norm = mcolors.Normalize() 
zz = G(xx, yy) 
phase = np.angle(zz) 
mag = np.abs(zz) 

# color converter 
c = mcolors.ColorConverter().to_rgb 

# Custom rgb Colormap 
rgb = make_colormap(
    [c('red'), c('yellow'), 0.33, c('yellow'), c('green'), c('cyan'), 0.5, c('cyan'), 
    c('blue'), c('magenta'), 0.833, c('magenta'), c('red')]) 

# Turn data points into rgb values 
z_data_rgb = rgb(norm(phase)) 
# normalizing the intensity values 
intensity = norm(mag) 

# defining light source 
ls = mcolors.LightSource() 

# plotting 
plt.imshow(ls.blend_hsv(z_data_rgb, intensity), extent=[-3, 3, -3, 3]) 
plt.show() 

ottengo il seguente grafico: enter image description here

se ha funzionato correttamente alcune aree sulla trama dovrebbe avere meno di saturazione rispetto ad altri in base ai valori di intensità.

Grazie

risposta

6

Perché non utilizzare hsv_to_rgb e tracciare con rgb colori?

from matplotlib.colors import hsv_to_rgb 
rgb = hsv_to_rgb(hsv)