首页 > 解决方案 > Matplotlib:从二进制数据填充

问题描述

我有一个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)

我想在 data 所在的任何网格点上绘制具有特定 alpha 的特定颜色,而在 data 为1时则什么都没有0。两个最接近的 matplotlib 函数是

边界框的预期行为如下:xGrid包含三个值,并且在 x 维度上有三个数据点。中的每个值xGrid表示每个数据点的中心点的位置,对于 类似yGrid。“填充数据点”则对应于填充由中心坐标 ( x, y) 定义的矩形。

实现这一目标的最佳方法是什么?

标签: pythonmatplotlib

解决方案


了解填充区域将使用网格交叉点作为中心点来绘制,我们有

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记录在这里,并且在第一个循环中创建列表只是for可能由.plt.fill


关于效率的说明

如果必须绘制数百个矩形,上面的简单方法是可以的,如果我们进入数万个,也许我们想用 循环数据点enumerate,如果需要构建xy列表并在其上绘制矩形飞,或者,甚至更好的性能,创建一个Rectangle补丁,将它放入 a并在我们完成循环后PatchCollection使用该方法- Matplotlib 文档中提供了一个示例,可以轻松适应范围,另一个示例是我的新答案。ax.add_collectiondata


推荐阅读