2017-01-31 6 views
5

Ich versuche, zwei Variablen x und y auf einer Karte mit Farben darzustellen.Matplotlib Colormap mit zwei Parameter

Bisher ist das Beste, was ich erreichen kann, Farbe für eine Variable und Transparenz für eine andere zu verwenden.

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

Ist es möglich, einen 2D-colormap in matplotlib zu erstellen, die zwei Variablen nehmen?

+0

Ähnliche (definitiv nicht dupe) http://stackoverflow.com/q/10958835/2988730 –

+0

Konkret die zweite Antwort http://stackoverflow.com/a/10992313/2988730 –

+0

Sie könnten auch versuchen, Ihre eigene Colormap, dass implementieren Nimmt x und y kodiert als einen einzelnen Parameter auf, z eine komplexe Zahl und eine Funktion, die diesen codierten Wert zurückgibt. –

Antwort

3

Im Allgemeinen sind Colormaps in Matplotlib 1D, d. H. Sie bilden einen Skalar zu einer Farbe ab. Um eine 2D Colormap zu erhalten, müsste man irgendwie eine Zuordnung von zwei Skalaren zu einer Farbe erfinden. Obwohl dies prinzipiell möglich ist, ist es nicht so praktisch wie die üblichen Colormaps.

Unten finden Sie ein Beispiel, in dem wir zwei Parameter dem roten und blauen RGB-Farbkanal zuordnen und dadurch eine 2D-Farbkarte erstellen.

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

Dieses Schema kann natürlich auf andere (kompliziertere) colormappings erweitert werden und auch Plots imshow oder pcolormesh. Auch die Verwendung des HSV colorscheme kann im Vergleich zu RGB vorteilhaft sein, so dass matplotlib.colors.hsv_to_rgb(hsv) hilfreich sein könnte.

Verwandte Themen