为什么pyplot.contour()要求Z是2D数组?

dhr*_*eel 12 python numpy matplotlib contour

matplotlib.pyplot.contour()函数需要3个输入数组X,YZ.
数组XY指定点的x坐标和y坐标,同时Z指定在点处评估的感兴趣函数的对应值.

据我所知,np.meshgrid()可以很容易地生成作为参数的数组contour():

X = np.arange(0,5,0.01)
Y = np.arange(0,3,0.01)

X_grid, Y_grid = np.meshgrid(X,Y)
Z_grid = X_grid**2 + Y_grid**2

plt.contour(X_grid, Y_grid, Z_grid)  # Works fine
Run Code Online (Sandbox Code Playgroud)

这很好用.方便的是,这也很好:

plt.contour(X, Y, Z_grid)  # Works fine too
Run Code Online (Sandbox Code Playgroud)

但是,为什么Z输入需要是2D阵列?

为什么类似以下内容不允许,即使它指定所有相同的数据对齐?

plt.contour(X_grid.ravel(), Y_grid.ravel(), Z_grid.ravel())  # Disallowed
Run Code Online (Sandbox Code Playgroud)

另外, Z指定了什么是语义(没有相应的XY)?

Imp*_*est 11

查看一个文档,contour发现有几种方法可以调用此函数,例如contour(Z)contour(X,Y,Z).因此,您会发现它根本不需要任何XY值.

但是,为了绘制轮廓,必须为函数知道底层网格.Matplotlib contour基于矩形网格.但即便如此,允许contour(z),与z作为一维数组,就不可能知道现场应该如何绘制.在contour(Z)其中Z是2D阵列的情况下,其形状明确地设置绘图的网格.

一旦知道了这个网格,可选XY数组是否扁平化是相当不重要的; 这实际上是文档告诉我们的:

X和Y必须都是2-D,形状与Z相同,或者它们必须都是1-D,因此len(X)是Z中的列数,len(Y)是Z中的行数.

很明显,某些东西 plt.contour(X_grid.ravel(), Y_grid.ravel(), Z_grid.ravel())不能产生等高线图,因为有关网格形状的所有信息都会丢失,轮廓功能无法知道如何解释数据.例如,如果len(Z_grid.ravel()) == 12,底层网格的形状可以是任何一个(1,12), (2,6), (3,4), (4,3), (6,2), (12,1).

一个可能的出路当然可以是允许一维数组并引入一个参数shape,比如plt.contour(x,y,z, shape=(6,2)).然而事实并非如此,所以你必须忍受Z需要2D 的事实.

但是,如果您正在寻找一种方法来获得带有扁平(ravelled)阵列的countour图,则可以使用plt.tricontour().

plt.tricontour(X_grid.ravel(), Y_grid.ravel(), Z_grid.ravel()) 
Run Code Online (Sandbox Code Playgroud)

这里将使用Delaunay Triangualation在内部生成三角形网格.因此,即使完全随机化的点也会产生很好的结果,如下图所示,其中将其与给定的相同随机点进行比较contour.

在此输入图像描述

(这是产生这张图片代码)