我需要用matplotlib的imshow()绘制图像,然后用不同的颜色标记一些像素.只是在初始数组中更改它们的值将无法工作,因为我需要使用我正在使用的colourmap中不存在的颜色.所以我最初的目的是在第一个图像上方绘制第二个生成的数组,其中大部分都被屏蔽,所需的像素没有被屏蔽,并且有一些值(对于不同的坐标可能使用不同的颜色可能不同).并且它与matplotlib的交互式查看器很好地协同工作,但是当保存到文件中时,一切都会因为这个错误而被扭曲,我在相同的情况下报告:https://github.com/matplotlib/matplotlib/issues/3057
是否有其他选项可以改变某些像素的颜色?
你已经建议了最简单的方法(在顶部覆盖另一个图像),但是如果它不能按照你想要的方式工作,还有其他选择.
最直接的方法是使用色彩映射将数组渲染为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()
Run Code Online (Sandbox Code Playgroud)

这种方法的一个缺点是你不能只是调用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()
Run Code Online (Sandbox Code Playgroud)

使用隐形imshow是为此目的制作代理艺术家的最简单方法,但如果速度是一个问题(或者如果它以某种方式触发您提到的渲染错误),您也可以使用任何ScalarMappable. ScalarMappable是一个抽象基类,通常只用于继承colorbar支持.因为我们不需要绘制任何东西,所以我们可以直接使用它.
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()
Run Code Online (Sandbox Code Playgroud)
set_bad,set_over或set_under的set_bad,set_over并且set_under颜色映射的方法,让你是NaN的或从颜色表的指定范围的标志像素.
因此,另一种做你想要的方法是将这些值设置为NaN并指定NaN颜色应该是什么(set_bad..默认情况下,它对大多数颜色图是透明的.).
如果你有一个整数数组或者已经需要透明的NaN像素,你可以同样滥用set_over和set_under.在这种情况下,您需要手动指定vmin或vmax何时调用imshow.
作为使用/滥用的快速示例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()
Run Code Online (Sandbox Code Playgroud)

这种方法相对于第一种方法的一个优点是绘制颜色条更容易一些.(缺点是这种方法不太灵活.):
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()
Run Code Online (Sandbox Code Playgroud)

| 归档时间: |
|
| 查看次数: |
9049 次 |
| 最近记录: |