使用matplotlib.pyplot.imshow()时如何确定颜色?
How to determine the colours when using matplotlib.pyplot.imshow()?
我正在使用 imshow() 绘制二维 numpy 数组,例如:
my_array = [[ 2. 0. 5. 2. 5.]
[ 3. 2. 0. 1. 4.]
[ 5. 0. 5. 4. 4.]
[ 0. 5. 2. 3. 4.]
[ 0. 0. 3. 5. 2.]]
plt.imshow(my_array, interpolation='none', vmin=0, vmax=5)
它绘制了这张图片:
然而,我想做的是改变颜色,例如 0 是红色,1 是绿色,2 是橙色,你明白我的意思。有没有办法做到这一点,如果有,怎么做?
我试过通过更改颜色图中的条目来做到这一点,如下所示:
cmap = plt.cm.jet
cmaplist = [cmap(i) for i in range(cmap.N)]
cmaplist[0] = (1,1,1,1.0)
cmaplist[1] = (.1,.1,.1,1.0)
cmaplist[2] = (.2,.2,.2,1.0)
cmaplist[3] = (.3,.3,.3,1.0)
cmaplist[4] = (.4,.4,.4,1.0)
cmap = cmap.from_list('Custom cmap', cmaplist, cmap.N)
但它并没有像我预期的那样工作,因为 0 = 颜色图中的第一个条目,但是 1 例如 != 颜色图中的第二个条目,因此只有 0 被不同地绘制:
我认为最简单的方法是使用 ListedColormap
,并可选择使用 BoundaryNorm
来定义 bins
。给定上面的数组:
import matplotlib.pyplot as plt
import matplotlib as mpl
colors = ['red', 'green', 'orange', 'blue', 'yellow', 'purple']
bounds = [0,1,2,3,4,5,6]
cmap = mpl.colors.ListedColormap(colors)
norm = mpl.colors.BoundaryNorm(bounds, cmap.N)
plt.imshow(my_array, interpolation='none', cmap=cmap, norm=norm)
因为您的数据值与颜色边界一对一映射,所以 normalizer
是多余的。但我已经包含它以展示如何使用它。例如,当您希望值 0,1,2 为红色,3,4,5 为绿色等时,您可以将边界定义为 [0,3,6...]。
我正在使用 imshow() 绘制二维 numpy 数组,例如:
my_array = [[ 2. 0. 5. 2. 5.]
[ 3. 2. 0. 1. 4.]
[ 5. 0. 5. 4. 4.]
[ 0. 5. 2. 3. 4.]
[ 0. 0. 3. 5. 2.]]
plt.imshow(my_array, interpolation='none', vmin=0, vmax=5)
它绘制了这张图片:
然而,我想做的是改变颜色,例如 0 是红色,1 是绿色,2 是橙色,你明白我的意思。有没有办法做到这一点,如果有,怎么做?
我试过通过更改颜色图中的条目来做到这一点,如下所示:
cmap = plt.cm.jet
cmaplist = [cmap(i) for i in range(cmap.N)]
cmaplist[0] = (1,1,1,1.0)
cmaplist[1] = (.1,.1,.1,1.0)
cmaplist[2] = (.2,.2,.2,1.0)
cmaplist[3] = (.3,.3,.3,1.0)
cmaplist[4] = (.4,.4,.4,1.0)
cmap = cmap.from_list('Custom cmap', cmaplist, cmap.N)
但它并没有像我预期的那样工作,因为 0 = 颜色图中的第一个条目,但是 1 例如 != 颜色图中的第二个条目,因此只有 0 被不同地绘制:
我认为最简单的方法是使用 ListedColormap
,并可选择使用 BoundaryNorm
来定义 bins
。给定上面的数组:
import matplotlib.pyplot as plt
import matplotlib as mpl
colors = ['red', 'green', 'orange', 'blue', 'yellow', 'purple']
bounds = [0,1,2,3,4,5,6]
cmap = mpl.colors.ListedColormap(colors)
norm = mpl.colors.BoundaryNorm(bounds, cmap.N)
plt.imshow(my_array, interpolation='none', cmap=cmap, norm=norm)
因为您的数据值与颜色边界一对一映射,所以 normalizer
是多余的。但我已经包含它以展示如何使用它。例如,当您希望值 0,1,2 为红色,3,4,5 为绿色等时,您可以将边界定义为 [0,3,6...]。