首页 > 解决方案 > Matplotlib:imshow 上的透明间谍图

问题描述

我正在尝试创建一个具有两种类型的图的图:pyplot.spyover pyplot.imshow。由于 spy 绘制了一个稀疏矩阵,我希望它在矩阵为零的地方是透明的。但是,当我在同一轴上绘制稀疏矩阵时,它似乎正在创建一个新的画布,覆盖由 imshow 创建的画布。

这是我的步骤的描述。请注意,我在标记样式中使用 spy,它返回一个 Line2D 对象。

A: 数组大小m*n

Bm*n:大多数元素为 0的大小数组(其余为 1)

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
p1 = ax.imshow(A, aspect='auto')
p2 = ax.spy(B, aspect = 'auto', markersize=2, alpha = 0.25)
plt.show()

我很感激建议和帮助。

标签: pythonmatplotlibsparse-matriximshowspy

解决方案


基于以下想法:https ://stackoverflow.com/a/51601850/8447885并根据您的需要对其进行一些调整,您可以修改颜色图,使第一个值的 alpha 通道设置为 0(或类似的到上面引用的链接 - 从 0 逐渐增加到 1),并使用此颜色图和修改后的 alpha 值作为您的第二个图:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import LinearSegmentedColormap

A = np.random.rand(5,4)
B = np.zeros((5,4))
B[2,2] = 1
B[3,2] = 1
B[4,2] = 1
color_array = plt.get_cmap('seismic')(range(256))
color_array[:,-1] = np.linspace(0,1,256) # the alpha channel is the last one in the array
map_object = LinearSegmentedColormap.from_list(name='seismic_alpha',colors=color_array)
plt.register_cmap(cmap=map_object)

fig, ax = plt.subplots()
p1 = ax.imshow(A, aspect='auto',cmap='seismic')
p2 = ax.spy(B, aspect = 'auto', alpha = 0.75, cmap='seismic_alpha')
plt.show()

推荐阅读