我正在使用numpy 1.6和matplotlib 1.1.1,尝试从我拥有的标量场生成速度场。到目前为止,我是这样生成我的标量数据的:
num_samples = 50
dim_x = np.linspace(self.min_x, self.max_x,num_samples)
dim_y = np.linspace(self.min_y, self.max_y,num_samples)
X, Y = np.meshgrid(dim_x, dim_y)
len_x = len(dim_x)
len_y = len(dim_y)
a = np.zeros([len_x, len_y], dtype=float)
for i, y in enumerate(dim_y):
for j, x in enumerate(dim_x):
a[i][j] = x*y # not exactly my function, just an example
然后我得到了渐变色:
(velx,vely) = np.gradient(a)
从numpy文档中可以看到,velx是向量场的x分量,而vely是y分量。查看matplotlib文档,使用quiver函数绘制矢量场时,它说明velx和vely分别是向量场的x和y分量:
fig0 = plt.figure()
ax = fig0.add_subplot(111)
Q = ax.quiver(X,Y, velx, vely )
plt.show()
这会给出速度场的错误结果:
唯一让图形看起来正常的方法是反转quiver上的组件:
Q = ax.quiver(X,Y, vely, velx )#WHY???
我怀疑这类似行列排序,但是如果np.gradient的输出被倒置了,或者quiver被倒置了,我就搞不清楚了。所有一维问题都按预期工作。谢谢!
编辑:为了更加清晰地说明这种情况如何倒置,请更改函数。
a[i][j] = x*y
to
a[i][j] = x*x
渐变应该在x方向上,随着x的增加而增加。结果仍然不正确:如果我使用
Q = ax.quiver(X,Y, velx, vely )
我理解为
如果我将其反转
Q = ax.quiver(X,Y, vely, velx )
我明白了
或许有一种更符合Python风格(且正确的)方法可以实现...
dim_y
时返回i
,在迭代dim_x
时返回j
。然后将元素打包为a[i,j]
。我有遗漏什么吗(完全有可能)。 - mgilson