如何在 Python 中用二进制信息覆盖 pcolormesh

Posted

技术标签:

【中文标题】如何在 Python 中用二进制信息覆盖 pcolormesh【英文标题】:How to overlay a pcolormesh with binary information in Python 【发布时间】:2022-01-17 10:35:27 【问题描述】:

给定一个二维数组

172,47,117
192,67,251
195,103,9
211,21,242

目标是放置标记(例如,形状、线条),并参考下方的二进制 2D 坐标与 2D 图像重叠

0,1,0
0,0,0
0,1,0
1,1,0

具体来说,如果单元格等于1,则会放置一个标记。

预期的输出如下。在这个例子中,标记是水平红线的形式。但是,标记可以是使代码更直接的任何其他形状。

我可以知道如何使用 Python 中的任何图形包来实现这一点吗?

以上坐标可以通过以下方式复制

import numpy as np
import matplotlib.pyplot as plt
np.random.seed(0)
X=np.random.randint(256, size=(4, 3))
arrshape=np.random.randint(2, size=(4, 3))
fig = plt.figure(figsize=(8,6))
plt.pcolormesh(X,cmap="plasma")
plt.title("Plot 2D array")
plt.colorbar()
plt.show()

【问题讨论】:

您的标记顺序好像倒置了。 【参考方案1】:

您可以输入scatter

x,y = X.shape
xs,ys = np.ogrid[:x,:y]
# the non-zero coordinates
u = np.argwhere(arrshape)

plt.scatter(ys[:,u[:,1]].ravel()+.5, 
            xs[u[:,0]].ravel()+0.5,
            marker='x', color='r', s=100)

输出:

【讨论】:

【参考方案2】:

一种方法是使用matplotlib

import numpy as np
import matplotlib.pyplot as plt
np.random.seed(0)
X=np.random.randint(256, size=(4, 3))
arrshape=np.random.randint(2, size=(4, 3))
fig = plt.figure(figsize=(8,6))
plt.pcolormesh(X,cmap="plasma")
plt.title("Plot 2D array")
plt.colorbar()

markers = [
    [0,1,0],
    [0,0,0],
    [0,1,0],
    [1,1,0]]

draw = []
for y, row in enumerate(markers):
    prev = 0
    for x, v in enumerate(row):
        if v == 1:
            plt.plot([x+0.25, x+0.75], [y+0.5, y+0.5], 'r-', linewidth=5)
            if prev == 1:
                plt.plot([x-0.5, x+0.5], [y+0.5, y+0.5], 'r-', linewidth=5)
        prev = v

plt.show()

输出: (因为你的标记是颠倒的)

【讨论】:

以上是关于如何在 Python 中用二进制信息覆盖 pcolormesh的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PHP 中用新值覆盖现有的 Cookie?

在 Python 中用二进制数据编码 MIME 多部分?

如何在mongodb中用另一个覆盖模式的一个字段

如何在 Kotlin 中用继承的类覆盖方法?

如何在 BigQuery 客户端 Python API 中以原子方式覆盖表

你能在 LibreOffice 中用 Python 录制宏吗?