Python绘制2D高斯函数梯度矢量quiver图代码异常排查
2D高斯梯度矢量图绘制问题分析
你代码的核心问题出在梯度分量的赋值顺序错误,次要问题是绘制用的坐标和原始函数坐标不匹配,具体如下:
- 梯度分量顺序错误:
np.gradient(z)返回的2D梯度结果中,第一个元素是沿y轴(行方向)的梯度分量,第二个元素才是沿x轴(列方向)的梯度分量,你代码里把两个分量赋值反了,直接导致箭头方向全部错误。 - 坐标不匹配:你后续生成了
range(50)的索引网格用于绘图,和原始高斯函数定义的[-5,5]物理坐标没有对应,虽然不影响方向展示,但会导致坐标刻度不符合函数实际定义域。
修正后可运行代码
import numpy as np from matplotlib import pyplot as plt # define normalized 2D gaussian def gaus2d(x=0, y=0, mx=0, my=0, sx=1, sy=1): return 1. / (2. * np.pi * sx * sy) * np.exp(-((x - mx)**2. / (2. * sx**2.) + (y - my)**2. / (2. * sy**2.))) x = np.linspace(-5, 5) y = np.linspace(-5, 5) x, y = np.meshgrid(x, y) # get 2D variables instead of 1D z = gaus2d(x, y) gauss_grad = np.gradient(z) # calculating array of gaussian gradient # 修正梯度分量赋值顺序,同时匹配原始物理坐标 U = gauss_grad[1] # x分量对应第二个返回值 V = gauss_grad[0] # y分量对应第一个返回值 fig, hf = plt.subplots(figsize=(10,10)) # setting up quiver plot hf.set_title("Example - gradient of gaussian- every 2nd arrow") # 直接用原始x、y网格绘制,调整scale参数适配梯度数值 Q = hf.quiver(x[::2, ::2], y[::2, ::2], U[::2, ::2], V[::2, ::2], units='width', pivot='mid', scale=0.01, headwidth=5) qk = hf.quiverkey(Q, 0.9, 0.9, 0.001, r'$2d \ vector \ plot$', labelpos='E', coordinates='figure') hf.scatter(x[::2, ::2], y[::2, ::2], color='c', s=0) plt.show()
运行修正后的代码即可得到符合预期的梯度矢量图:所有箭头指向高斯分布的中心(对应函数值上升最快的方向)。
内容的提问来源于stack exchange,提问作者Brendan Darrer
相关产品推荐
相关产品推荐

