2017-01-31 46 views
5

Próbuję reprezentować dwie zmienne x i y na mapie za pomocą kolorów.Matformotb Colormap z dwoma parametrami

Do tej pory najlepszym możliwym do osiągnięcia jest użycie koloru dla jednej zmiennej i przezroczystości dla innej.

plt.Polygon(shape.points, fill=False, color=cmap(y), alpha=x)

Czy to możliwe, aby stworzyć mapę kolorów 2D w matplotlib które ma dwie zmienne?

+0

Powiązane (zdecydowanie nie dupe) http://stackoverflow.com/q/10958835/2988730 –

+0

W szczególności druga odpowiedź http://stackoverflow.com/a/10992313/2988730 –

+0

Możesz również spróbować wprowadzić własną mapę kolorów, przyjmuje xiy zakodowane jako pojedynczy parametr, np liczba zespolona i funkcja zwracająca zakodowaną wartość. –

Odpowiedz

3

Ogólnie colormaps w matplotlib to 1D, tzn. Mapują skalar na kolor. Aby uzyskać colormap 2D, trzeba jakoś wymyślić odwzorowanie dwóch skalarów na kolor. Chociaż jest to zasadniczo możliwe, nie jest tak wygodne, jak zwykłe mapy kolorów.

Przykład znajduje się poniżej, gdzie mapujemy dwa parametry odpowiednio na czerwony i niebieski kanał koloru RGB, a tym samym tworzymy mapę kolorów 2D.

import matplotlib.pyplot as plt 
import numpy as np 

fig, ax = plt.subplots() 
ax.set_aspect("equal") 

x = [1,1,2,2,3,3] # xdata 
y = [1,2,3,1,2,3] # ydata 
p1 = [0.2,0.4,.6,.8,.6,.1] # parameter 1 
p2 = [0.4,0.5,.7,.1,.3,.7] # parameter 2 

# create a very simple colormap, 
# mapping parameter 1 to the red channel and 
#   parameter 2 to the blue channel 
cmap = lambda p1,p2 : (p1, 0, p2) 

# put shapes at positions (x[i], y[i]) and colorize them with our 
# cmap according to their respective parameters 
for i in range(len(x)): 
    circle = plt.Circle((x[i], y[i]), 0.5, color=cmap(p1[i],p2[i])) 
    ax.add_artist(circle) 
    tx="p1: {}\np2: {}".format(p1[i],p2[i]) # create a label 
    ax.text(x[i], y[i], tx, ha="center", color="w", va="center") 

ax.set_xlim(0,4) 
ax.set_ylim(0,4) 
ax.set_xlabel("x") 
ax.set_ylabel("y") 

# create the legend: 

plt.subplots_adjust(left=0.1, right=0.65, top=0.85) 
cax = fig.add_axes([0.7,0.55,0.3,0.3]) 
cp1 = np.linspace(0,1) 
cp2 = np.linspace(0,1) 
Cp1, Cp2 = np.meshgrid(cp1,cp2) 
C0 = np.zeros_like(Cp1) 
# make RGB image, p1 to red channel, p2 to blue channel 
Legend = np.dstack((Cp1, C0, Cp2)) 
# parameters range between 0 and 1 
cax.imshow(Legend, origin="lower", extent=[0,1,0,1]) 
cax.set_xlabel("p1") 
cax.set_ylabel("p2") 
cax.set_title("2D cmap legend", fontsize=10) 

plt.show() 

enter image description here

Ten schemat może oczywiście zostać rozszerzone na inne (bardziej skomplikowane) colormappings a także imshow lub działki pcolormesh. Ponadto korzystanie z urządzenia HSV colorscheme może być korzystne w porównaniu z RGB, więc pomocna może być funkcja matplotlib.colors.hsv_to_rgb(hsv).