我有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 )我发现,类似的选项ListedColormap
或LinearSegmentedColormap
可能是有益的,但我真的不知道如何使用它来获得我想要的是。
编辑:我做了,它不工作,因为我不知道如何使用ListedColormap
和LinearSegmentedColormap
得到我想要的东西
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")
甲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)