Matplotlib Colormap with two parameters

I am trying to represent two variables x and y on a map using colors.

So far, the best I can do is use color for one variable and transparency for another.

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

Is it possible to create a 2D map in matplotlib that accepts two variables?

+5
source share
1 answer

In general, color maps in matplotlib are 1D, that is, they map the scalar to color. To get a 2D map, one would have to somehow come up with a comparison of the two scalars with the color. Although this is possible in principle, it is not as convenient as conventional color cards.

Below is an example where we map two parameters with the red and blue RGB color channels, respectively, and thereby create a 2D map.

 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

This scheme, of course, can be extended to other (more complex) color maps, as well as graphic images or pcolormesh. In addition, using the HSV color scheme can be advantageous over RGB, so matplotlib.colors.hsv_to_rgb(hsv) can be useful.

+3
source

Source: https://habr.com/ru/post/1263634/


All Articles