您已经建议了最简单的方法(在顶部叠加另一张图片),但如果这不是您想要的效果,还有其他选择。
方法 #1 - 手动渲染和合成图像
最直接的方法是使用颜色图将数组渲染为 RGB,然后更改所需的像素。
举个简单的例子:
import numpy as np
import matplotlib.pyplot as plt
data = np.arange(100).reshape(10, 10)
cmap = plt.cm.gray
norm = plt.Normalize(data.min(), data.max())
rgba = cmap(norm(data))
# Set the diagonal to red...
rgba[range(10), range(10), :3] = 1, 0, 0
plt.imshow(rgba, interpolation='nearest')
plt.show()
此方法的一个缺点是您不能只调用fig.colorbar(im),因为您正在传递预渲染的 rgb 图像。因此,如果您需要颜色条,则必须使用代理艺术家。最简单的方法是使用imshow(data, visible=False) 添加一个额外的、不可见的(不是绘制的,而不是透明的)艺术家,然后将颜色图基于该艺术家。举个简单的例子:
import numpy as np
import matplotlib.pyplot as plt
data = np.arange(100).reshape(10, 10)
cmap = plt.cm.gray
norm = plt.Normalize(data.min(), data.max())
rgba = cmap(norm(data))
# Set the diagonal to red
rgba[range(10), range(10), :3] = 1, 0, 0
fig, ax = plt.subplots()
ax.imshow(rgba, interpolation='nearest')
# Add the colorbar using a fake (not shown) image.
im = ax.imshow(data, visible=False, cmap=cmap)
fig.colorbar(im)
plt.show()
使用不可见的imshow 是为此目的制作代理艺术家的最简单方法,但如果速度是一个问题(或者如果它以某种方式触发了您提到的渲染错误),您也可以使用任何ScalarMappable。 ScalarMappable 是一个抽象基类,通常仅用于继承自颜色条支持。因为我们不需要绘制任何东西,所以我们可以直接使用它。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.cm import ScalarMappable
data = np.arange(100).reshape(10, 10)
cmap = plt.cm.gray
norm = plt.Normalize(data.min(), data.max())
rgba = cmap(norm(data))
# Set the diagonal to red
rgba[range(10), range(10), :3] = 1, 0, 0
fig, ax = plt.subplots()
ax.imshow(rgba, interpolation='nearest')
# Add the colorbar using a ScalarMappable
im = ScalarMappable(norm, cmap)
im.set_array(data)
fig.colorbar(im)
plt.show()
方法 #2 - 滥用 set_bad、set_over 或 set_under
颜色图的set_bad、set_over 和set_under 方法允许您标记NaN 或颜色图指定范围之外的像素。
因此,另一种做你想做的事情的方法是将这些值设置为 NaN 并指定 NaN 颜色应该是什么(set_bad.. 默认情况下,它对大多数颜色图都是透明的。)。
如果你有一个整数数组或者已经需要透明的 NaN 像素,你可以类似地滥用set_over 和set_under。在这种情况下,您需要在调用imshow 时手动指定vmin 或vmax。
作为使用/滥用set_bad 的快速示例:
import numpy as np
import matplotlib.pyplot as plt
data = np.arange(100).reshape(10, 10).astype(float)
cmap = plt.cm.gray
cmap.set_bad((1, 0, 0, 1))
# Set the diagonal to NaN
data[range(10), range(10)] = np.nan
plt.imshow(data, cmap=cmap, interpolation='nearest')
plt.show()
与第一种方法相比,此方法的一个优点是绘制颜色条更容易一些。 (缺点是这种方法不够灵活。):
import numpy as np
import matplotlib.pyplot as plt
data = np.arange(100).reshape(10, 10).astype(float)
cmap = plt.cm.gray
cmap.set_bad((1, 0, 0, 1))
# Set the diagonal to NaN
data[range(10), range(10)] = np.nan
plt.imshow(data, cmap=cmap, interpolation='nearest')
plt.colorbar()
plt.show()