定义一个颜色表用于在阵列中的每个设定值的(Define a colormap for each se

2019-09-30 14:30发布

我有3套,我要的颜色值的数组:

  • 为0和1之间的值( np.ma.masked_array(array, array > 1.)我想要的梯度( cmap = cm.Greens例如)
  • 用于等于2的值( np.ma.masked_array(array, array != 2.)我想要的颜色是红色
  • 对于等于3个值( np.ma.masked_array(array, array != 3.)我想要的颜色是灰色

我应该定义每个组值的颜色表,然后合并所有的人都变成一个颜色表? 如果是这样我怎么继续?

在这个网站上( http://scipy.github.io/old-wiki/pages/Cookbook/Matplotlib/Show_colormaps )我发现,类似的选项ListedColormapLinearSegmentedColormap可能是有益的,但我真的不知道如何使用它来获得我想要的是。

编辑:我做了,它不工作,因为我不知道如何使用ListedColormapLinearSegmentedColormap得到我想要的东西

from random import random
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
from matplotlib import cm
from matplotlib.colors import ListedColormap

n=11

tab = np.array([[random() for i in range(n)] for j in range(n)])
tab[1,2] = 2.
tab[3,4] = 2.
tab[5,6] = 3.
tab[7,8] = 3.

values1 = np.ma.masked_array(tab, tab > 1.)
values2 = np.ma.masked_array(tab, tab != 2.)
values3 = np.ma.masked_array(tab, tab != 3.)

colors1 = cm.Greens
colors2 = ListedColormap(['red'], 'indexed')
colors3 = ListedColormap(['gray'], 'indexed')

colors = np.vstack((colors1, colors2, colors3))
mycmap = mcolors.LinearSegmentedColormap.from_list('my_colormap', colors)

print plt.imshow(tab, cmap = mycmap, interpolation="none")

Answer 1:

ListedColormap最好被用于离散值,而LinearSegmentedColormap为连续值更容易地创建。 特别是,如果必须使用一个存在的颜色表,一个LinearSegmentedColormap是一个不错的选择。

LinearSegmentedColormap.from_list("name", colors)预计,颜色列表colors (不是颜色表!)。 可以使用存在的颜色表来创建该列表中,例如greens = cm.Greens(np.linspace(0,1, num=50))与来自地图50点的颜色。 为另一种颜色来覆盖相同的范围,我们可以添加相同数量的颜色,例如全部为红色或灰色。

下面是一个例子。

from random import random
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
from matplotlib import cm

n=11
tab = np.array([[random() for i in range(n)] for j in range(n)])
tab[1,2] = 2.
tab[3,4] = 2.
tab[5,6] = 3.
tab[7,8] = 3.

values1 = np.ma.masked_array(tab, tab > 1.)
values2 = np.ma.masked_array(tab, tab != 2.)
values3 = np.ma.masked_array(tab, tab != 3.)

# 50 values for later use from 0 to 1
greens = cm.Greens(np.linspace(0,1, num=50))
# 25 values for later use from 1 to 1.5
greensfill = cm.Greens(np.ones(25))
# 50 values red for later use from 1.5 to 2.5 
red = [(1,0,0,1)]*len(greens)
# 50 values gray for later use from 2.5 to 3.5 
gray = [(.5,.5,.5,1)]*len(greens)

colors = np.vstack((greens, greensfill, red, gray))
# in total we now have 175 colors in the colormap
mycmap = mcolors.LinearSegmentedColormap.from_list('my_colormap', colors)

#we now map those 175 colors to the range between 0 and 3.5
im = plt.imshow(tab, cmap = mycmap, interpolation="none", vmin=0, vmax=3.5)
cb = plt.colorbar(im)
cb.set_ticks([0,1,2,3])

plt.show()

在这里,从列表中的颜色最终颜色表间隔相等。

另一种可能是指定伴有相应值的颜色。

colors = [(0, "white"), (1./3.5, "green"), (1.5/3.5, "green"),
          (1.501/3.5, "red"), (2.5/3.5, "red"), (2.501/3.5, "gray"), (1, "gray") ]
mycmap = mcolors.LinearSegmentedColormap.from_list('my_colormap', colors)


文章来源: Define a colormap for each set of values in an array