如何在不使用numpy.meshgrid方法的情况下创建轮廓图?

1 投票
2 回答
4602 浏览
提问于 2025-04-18 04:59

我正在尝试使用这里提供的示例,来绘制我使用的一个函数的等高线图。不过,我在使用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()

enter image description here

撰写回答