我将回答有关如何将特定值设置为特定颜色而不考虑颜色图的一般问题。
在下面的代码中,出于说明目的,我认为这是您要映射白色的值-1。您将要为您的代码做一些不同的事情。
该技术使用a masked array来设置数据等于-1(要映射的值)的部分,然后使用cmap.set_bad()白色来为此值分配白色。
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
value = -1
data = np.arange(100).reshape((10, 10))
data[5, :] = -1 # Values to set -1
masked_array = np.ma.masked_where(data == value, data)
cmap = matplotlib.cm.spring # Can be any colormap that you want after the cm
cmap.set_bad(color='white')
plt.imshow(masked_array, cmap=cmap)
plt.show()
Run Code Online (Sandbox Code Playgroud)
希望能帮助到你。
我将提出一个原始问题的解决方案,该解决方案可扩展为分别为几种不同的颜色分配多个值。
解决方案
该解决方案涉及创建一个新的三维 NumPy ndarray,其中在每个 i,j 位置包含一个具有 RGB 值的 NumPy 数组。然后用 imshow (或 matshow)绘制这个新的 data3d 数组
# import packages
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
# generate data
np.random.seed(42)
data = np.random.randint(low=1, high=4, size=(10,10)) # possible values are 1,2,3
# define color map
color_map = {1: np.array([255, 0, 0]), # red
2: np.array([0, 255, 0]), # green
3: np.array([0, 0, 255])} # blue
# make a 3d numpy array that has a color channel dimension
data_3d = np.ndarray(shape=(data.shape[0], data.shape[1], 3), dtype=int)
for i in range(0, data.shape[0]):
for j in range(0, data.shape[1]):
data_3d[i][j] = color_map[data[i][j]]
# display the plot
fig, ax = plt.subplots(1,1)
ax.imshow(data_3d)
# add numbers to the plot
# thanks to tmdavison answer here /sf/answers/2862341121/
for i in range(0, data.shape[0]):
for j in range(0, data.shape[1]):
c = data[j,i]
ax.text(i, j, str(c), va='center', ha='center')
Run Code Online (Sandbox Code Playgroud)
背景 我最近遇到一个问题,我需要绘制几个单通道矩阵,并为每个矩阵中的 1、2 和 3 分配不同的颜色。1、2 和 3 的顺序根据矩阵而变化,这意味着使用定义的颜色方案通常会导致将不同颜色分配给不同矩阵中的相同值。例如,在第一个矩阵中,1 被分配给红色,而在第二个矩阵中,1 被分配给蓝色。
我花了很多时间在 stackoverflow 上搜索解决方案,但从未找到任何有效的方法。最终,我能够自己解决一个问题。这是该问题的解决方案,可扩展到多个值并且独立于主矩阵中值的顺序。它还可以与 matshow 而不是 imshow 一起使用。
假设您的图像是单通道图像而不是三通道图像,则可以通过定义将索引(例如灰度强度或图片值)映射到颜色的调色板来执行所需的任务:
import numpy as np
import matplotlib.pyplot as plt
palette = np.array([[ 0, 0, 0], # black
[255, 0, 0], # red
[ 0, 255, 0], # green
[ 0, 0, 255], # blue
[255, 255, 255]]) # white
I = np.array([[ 0, 1, 2, 0], # 2 rows, 4 columns, 1 channel
[ 0, 3, 4, 0]])
Run Code Online (Sandbox Code Playgroud)
图像转换是通过NumPy 的广播有效完成的:
RGB = palette[I]
Run Code Online (Sandbox Code Playgroud)
转换后的图像如下所示:
>>> RGB
array([[[ 0, 0, 0], # 2 rows, 4 columns, 3 channels
[255, 0, 0],
[ 0, 255, 0],
[ 0, 0, 0]],
[[ 0, 0, 0],
[ 0, 0, 255],
[255, 255, 255],
[ 0, 0, 0]]])
plt.imshow(RGB)
Run Code Online (Sandbox Code Playgroud)