如何在不使用numpy.meshgrid方法的情况下创建轮廓图?
我正在尝试使用这里提供的示例,来绘制我使用的一个函数的等高线图。不过,我在使用numpy.meshgrid的时候遇到了问题,出现了ValueError: setting an array element with a sequence
的错误。
所以我改为生成了一个列表,用来获取矩阵中不同点的值,具体是这样做的:
n_range = numpy.linspace(1,10,100)
mass_range = numpy.logspace(1,6,100)
mu = []
for n in n_range:
for mass in mass_range:
mu.append(function(n,mass))
n_range, mass_range = numpy.meshgrid(n_range, mass_range)
现在,mu
的内容对应于
mu[100*i + j] = function(n_range[i], mass_range[j])
我现在该如何组织另一个变量,让它从mu中获取值,并且能够正确地格式化,以便我可以根据我创建的numpy.meshgrid
来绘制这个变量呢?
作为第一次尝试,我试着用这个函数:
def plot_contour_mu():
n_range = np.linspace(1,10,10)
mass_range = np.logspace(1,6,10)
n_range, mass_range = np.meshgrid(n_range, mass_range)
mu = mu0_n_mDM(n_range, mass_range)
但是这导致了之前提到的ValueError,错误指向我计算mu0_n_nDM值的地方,具体是在这一行:
File "mucalc.py", line 109, in mu_0_n_nDM
return C * B * integrate.romberg(integrand,z_min,z_i)
File "/usr/lib/python2.7/dist-packages/scipy/integrate/quadrature.py", line 653, in romberg
ordsum = ordsum + _difftrap(vfunc, interval, n)
File "/usr/lib/python2.7/dist-packages/scipy/integrate/quadrature.py", line 527, in _difftrap
s = sum(function(points),0)
File "/usr/lib/python2.7/dist-packages/scipy/integrate/quadrature.py", line 110, in vfunc
output[0] = y0
2 个回答
0
看看这个关于3D绘图的教程 - http://matplotlib.org/1.3.1/mpl_toolkits/mplot3d/tutorial.html
还有numpy的meshgrid文档,了解它返回的是什么类型的对象 - http://docs.scipy.org/doc/numpy/reference/generated/numpy.meshgrid.html
你的n_range和mass_range是二维的numpy数组。你的mu也必须是一样的。你可以通过将n_range和mass_range作为参数传递给你的函数来实现这一点(前提是你的函数可以处理numpy数组)。
2
我觉得你只需要把 mu
的形状调整一下,用 mu=np.array(mu).reshape(100,100)
这行代码,然后用 plt.contourf(n_range,mass_range,mu.T)
来画图。
mu=np.array(mu).reshape(100,100)
plt.contourf(n_range,mass_range,mu.T)
plt.colorbar()