---- Y
matplotlib.pyplot.contour()
函数占3个输入阵列 X
Z
数组 X
和 Y
指定点的 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
这很好用。方便的是,这也很好用:
plt.contour(X, Y, Z_grid) # Works fine too
但是,为什么 Z
输入 必须 是二维数组?
为什么像下面这样的东西是不允许的,即使它指定了所有相同的数据适当对齐?
plt.contour(X_grid.ravel(), Y_grid.ravel(), Z_grid.ravel()) # Disallowed
此外, 仅 指定 Z
时的语义是什么(没有相应的 X
和 Y
)?
原文由 dhrumeel 发布,翻译遵循 CC BY-SA 4.0 许可协议
查看
contour
的文档, 发现有几种方法可以调用此函数,例如contour(Z)
或contour(X,Y,Z)
因此,您会发现它根本不需要任何X
或Y
值。然而,为了绘制等高线,函数必须知道底层网格。 Matplotlib 的
contour
基于矩形网格。但即便如此,允许contour(z)
,其中z
是一维数组,将无法知道应该如何绘制该字段。在contour(Z)
的情况下Z
是一个二维数组,它的形状明确地设置了绘图的网格。一旦该网格已知,可选的
X
和Y
数组是否被展平就变得不重要了;这实际上是文档告诉我们的:同样很明显,像
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 的事实。但是,如果您正在寻找一种方法来获得带有扁平(散乱)数组的计数图,则可以使用
plt.tricontour()
。这里将使用 Delaunay 三角剖分在内部生成一个三角形网格。因此,即使是完全随机化的点也会产生不错的结果,如下图所示,将其与给予
contour
的相同随机点进行比较。(这是 生成这张图片的代码)