我有一个包含填充数据的二进制 numpy
数组,以及两个定义数据边界框的网格:
data = np.random.choice([0, 1], size=12).reshape((3, 4))
xGrid = np.linspace(1, 4, 4)
yGrid = np.linspace(0.1, 0.3, 3)
我想在数据为 1
的任何网格点上绘制具有特定 Alpha 的特定颜色,当数据为 0< 时无/
。两个最接近的 matplotlib 函数是
fill
,需要 (x, y) 坐标,无法使用此数据imshow
或matshow
,不幸的是,它会在各处绘制一些颜色。也就是说,它还会在data == 0
的任何地方绘制从颜色映射中提取的一些颜色。现在,我可以尝试让该颜色成为斧头的背景颜色,但这相当令人讨厌。
边界框的预期行为如下:xGrid
包含三个值,并且 x 维度上有三个数据点。 xGrid 中的每个值表示每个数据点的中心点位置,与 yGrid 类似。 “填充数据点”相当于填充由中心坐标 (x, y
) 定义的矩形。
实现这一目标的最佳方法是什么?
最佳答案
了解填充区域是使用网格交叉点作为中心点绘制的,我们有
In [27]: import numpy as np
...: import matplotlib.pyplot as plt
...: np.random.seed(2018)
...: data = np.random.choice([0, 1], size=12).reshape((3, 4))
...: xGrid = np.linspace(1, 4, 4)
...: yGrid = np.linspace(0.1, 0.3, 3)
In [28]: print(data)
[[0 0 0 1]
[1 0 0 0]
[1 1 1 1]]
In [29]: dx, dy = (xGrid[1]-xGrid[0])/2, (yGrid[1]-yGrid[0])/2
In [30]: xli, yli = [], []
...: for y in yGrid:
...: for x in xGrid: # the x's in data are changing faster, so inner loop
...: xli.append([x-dx, x+dx, x+dx, x-dx, x-dx])
...: yli.append([y-dy, y-dy, y+dy, y+dy, y-dy])
In [31]: for xs, ys, Bool in zip(xli, yli, data.flatten()):
...: if Bool : plt.fill(xs, ys, color='red')
...: plt.gca().set_facecolor('yellow')
值得一提的是,仅绘制填充的矩形,如用不同颜色填充绘图区域的背景所示。
plt.fill
已记录here以及第一个for
中创建的列表循环只是可以由 plt.fill
绘制的矩形角的 x、y 坐标。 .
关于效率的说明
如果必须绘制数百个矩形,上面的简单方法就可以了,如果我们要绘制数以万计的也许,我们希望使用 enumerate
循环数据点。 ,如果需要构建 x、y 列表并动态绘制矩形,或者为了提高性能,创建 Rectangle
补丁,将其放入 PatchCollection
并使用 ax.add_collection
当我们完成 data
上的循环时的方法— an example is available在 Matplotlib 文档中,可以轻松适应范围和 another example这是我的新答案。
关于python - Matplotlib:从二进制数据填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53846424/