正如标题所示,我想通过使用三个一维数组来绘制等高线图。让我们说
x = np.array([1,2,3])
Run Code Online (Sandbox Code Playgroud)
和
y = np.array([1,2,3])
Run Code Online (Sandbox Code Playgroud)
和
z = np.array([20,21,45])
Run Code Online (Sandbox Code Playgroud)
为了在 matplotlib 中做一个轮廓图,我对x和y坐标进行了网格划分,X,Y = meshgrid(x,y)但是该z数组也必须是一个二维数组。我如何然后z变成一个二维数组以便它可以使用?
尽管 OP 意识到不可能用问题中的数据绘制等高线图,但在可以将数据视为 3d 表面的情况下,这仍然是一个相关的问题。
基本上有三种选择
这个超级简单。只需像这样使用plt.tricontourf函数(参见附录中示例数据的创建)
from matplotlib import pyplot as plt
plt.tricontourf(xdata, ydata, zdata)
plt.show()
Run Code Online (Sandbox Code Playgroud)
如果将网格数据存储在三个 1D-arrays 中,并且由于某种原因不想使用 tricontourf,则可以使用它制作一个轮廓图。(附录中给出的示例数据)
import pandas as pd
from matplotlib import pyplot as plt
df = pd.DataFrame(dict(x=xdata, y=ydata, z=zdata))
xcol, ycol, zcol = "x", "y", "z"
df = df.sort_values(by=[xcol, ycol])
xvals = df[xcol].unique()
yvals = df[ycol].unique()
zvals = df[zcol].values.reshape(len(xvals), len(yvals)).T
plt.contourf(xvals, yvals, zvals)
plt.show()
Run Code Online (Sandbox Code Playgroud)
df作为中间媒介。unique()下一步中给出的值排序。unique()。这有点类似于“网格网格”操作。reshape()方法来创建所需的二维数组。zvals将是一个 (N,M) 2d 数组,可以输入 plt.contour。import numpy as np
import pandas as pd
xs, ys = np.linspace(-4, 4), np.linspace(-4, 4)
xgrid, ygrid = np.meshgrid(xs, ys)
xdata, ydata = np.ravel(xgrid), np.ravel(ygrid)
zdata = (
2.3 * (1 - xdata) ** 2 * np.exp(-(ydata ** 2) - (xdata + 0.9) ** 2)
- 13.3
* (ydata / 2.2 - ydata ** 3 - xdata ** 4)
* np.exp(-(ydata ** 2) - xdata ** 2)
- 0.8 * np.exp(-((ydata + 1) ** 2) - xdata ** 2)
)
Run Code Online (Sandbox Code Playgroud)
id5*_*d5h -2
你z的错了。它需要给出网格每个点的值。如果是和z的函数,则按我所指的计算如下:xyzX_grid
import numpy as np
import matplotlib.pyplot as plt
def f(x):
return (x[:,0]**2 + x[:,1]**2)
x = np.array([1,2,3])
y = np.array([1,2,3])
xx, yy = np.meshgrid(x, y)
X_grid = np.c_[ np.ravel(xx), np.ravel(yy) ]
z = f(X_grid)
z = z.reshape(xx.shape)
plt.contour(xx, yy, z)
Run Code Online (Sandbox Code Playgroud)