python - Matplotlib:imshow 上的透明间谍图
问题描述
我正在尝试创建一个具有两种类型的图的图:pyplot.spy
over pyplot.imshow
。由于 spy 绘制了一个稀疏矩阵,我希望它在矩阵为零的地方是透明的。但是,当我在同一轴上绘制稀疏矩阵时,它似乎正在创建一个新的画布,覆盖由 imshow 创建的画布。
这是我的步骤的描述。请注意,我在标记样式中使用 spy,它返回一个 Line2D 对象。
A
: 数组大小m*n
B
m*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()
我很感激建议和帮助。
解决方案
基于以下想法: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()
推荐阅读
- excel - 消除VBA中的空格
- mapbox - 从矢量切片源对几何图形进行操作
- python - Django不想回到以前的设置
- javascript - 动态创建 Mocha 测试套件
- javascript - 在 Leaflet Motion Plugin 中捕获 Motion End 事件
- keyboard-shortcuts - LLDB 中的键映射
- python - 如何使用 mypy 的内部类型检查功能?
- javascript - 添加到 innerHTML 后未显示 JSON 表数据
- error-handling - React Hooks & Async Await:使用 Axios 调用处理错误
- python - 图片显示在 Dialogflow 的默认响应中,但不在 Facebook Messenger 响应中(为什么?)