python - 改变 plt.imshow() 图像像素的颜色

标签 python matplotlib

我需要用 matplotlib 的 imshow() 绘制图像,然后用不同颜色标记一些像素。仅仅改变它们在初始数组中的值是行不通的,因为我需要使用我正在使用的颜色图中不存在的颜色。所以我最初的意图是在第一张图像上方绘制第二个生成的数组,其中大部分被屏蔽,所需的像素未被屏蔽,并具有一些值(可能不同的值用于不同的坐标使用不同的颜色)。它与 matplotlib 的交互式查看器配合得很好,但是当保存到文件中时,一切都可能因为这个错误而失真,我在同样的情况下报告过:https://github.com/matplotlib/matplotlib/issues/3057

是否有任何其他选项可以更改某些像素的颜色?

最佳答案

您已经提出了最简单的方法(在顶部叠加另一张图片),但如果效果不尽如人意,还有其他选择。


方法 #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()

enter image description here

此方法的一个缺点是您不能只调用 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()

enter image description here

使用不可见的 imshow 是为此目的制作代理艺术家的最简单方法,但如果速度是一个问题(或者如果它以某种方式触发你提到的渲染错误)你也可以使用任何标量可映射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_badset_overset_under


颜色图的 set_badset_overset_under 方法允许您标记 NaN 或超出指定范围的像素颜色图。

因此,另一种方法是将这些值设置为 NaN 并指定 NaN 颜色应该是什么(set_bad..默认情况下它对大多数颜色图都是透明的。)。

如果您有一个整数数组或已经需要透明的 NaN 像素,您可以类似地滥用 set_overset_under。在这种情况下,您需要在调用 imshow 时手动指定 vminvmax

作为使用/滥用 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()

enter image description here

与第一种方法相比,此方法的一个优点是绘制颜色条更容易一些。 (缺点是这种方法的灵 active 要差很多。):

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()

enter image description here

关于python - 改变 plt.imshow() 图像像素的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26692946/

相关文章:

python - 如何将文件中的每一行作为参数传递给脚本?

python - lambda 是如何工作的?

python - 属性 lat 必须是显示在我的仪表板中的 float

python - 在 Python 中,将文本转换为 Zip 转换为 base64,反之亦然

python - 当将 matplotlib 与 ipython notebook plt.show() 函数一起使用时不起作用

python - 绘制条形图-colors python

python - 如何从 Element 获取原始 xml 作为字符串

python - 在 Mayavi 中设置 Nan 颜色

python : How to create a 2D density map/heat map

python - 类型错误 : Invalid dimensions for image data when plotting array with imshow()