python - 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 函数是
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
记录在这里,并且在第一个循环中创建的列表只是for
可能由.plt.fill
关于效率的说明
如果必须绘制数百个矩形,上面的简单方法是可以的,如果我们进入数万个,也许我们想用 循环数据点enumerate
,如果需要构建x,y列表并在其上绘制矩形飞,或者,甚至更好的性能,创建一个Rectangle
补丁,将它放入 a并在我们完成循环后PatchCollection
使用该方法- Matplotlib 文档中提供了一个示例,可以轻松适应范围,另一个示例是我的新答案。ax.add_collection
data
推荐阅读
- angular - 如何在 Angular 中测试条件?
- ruby-on-rails - 如果在rails参数中传递%,如何防止参数引发错误
- flutter - .documentID 未返回正确信息
- erlang - 如何在 Erlang 中打印一个空字符串
- django - 如何从 html 表单中保存外文(选择)?
- latex - 为什么引用自制环境时区块头的高度会增加?如何避免这种情况?
- android - 当我调用返回值的 AsyncTask 时,没有显示 ProgressDialog
- python - 导入错误:无法在 Anaconda 提示符下导入 numpy 和 pandas
- python - 将变量值插入列表 - python
- reactjs - 如何声明 React Context 初始状态的 TypeScript 类型?