正如标题所示,我想使用三个1D数组制作轮廓图。假设:
x = np.array([1,2,3])
并且
y = np.array([1,2,3])
并且。
z = np.array([20,21,45])
要在matplotlib中绘制等高线图,我需要将x和y坐标网格化为X,Y = meshgrid(x,y)。但是z数组也必须是2D数组。那么我该如何将z转换为2D数组以便使用呢?
正如标题所示,我想使用三个1D数组制作轮廓图。假设:
x = np.array([1,2,3])
并且
y = np.array([1,2,3])
z = np.array([20,21,45])
虽然 OP 意识到使用问题中的数据无法绘制轮廓图,但在数据可以被视为 3D 表面的情况下,这仍然是一个相关的问题。
基本上有三个选项:
这个非常简单。只需像这样使用 plt.tricontourf 函数即可(请参见附录中示例数据的创建)。
from matplotlib import pyplot as plt
plt.tricontourf(xdata, ydata, zdata)
plt.show()
如果有存储在三个1D数组中的网格化数据,且由于某种原因不想使用tricontourf,则可以使用以下方法制作contourf图。 (附录中提供示例数据)
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()
df
作为中间介质。unique()
给出的值被排序。unique()
获取x和y数据的所有唯一值。这有点像“meshgrid”操作的反向操作。reshape()
方法来创建所需的2d数组。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)
)
如果我使用已经ravel的数据进行操作,我会频繁遇到这个问题。在raveled数据中,2-D数组被压平了。
原始数据包含每个坐标的x、y和z值:
x = [0, 1, 2; 0, 1, 2]
y = [0, 0, 0; 1, 1, 1]
z = [0.1 , 0.2, 0.3 ; 0.2, 0.3, 0.4]
xx = np.ravel(x); yy = np.ravel(y) ; zz = np.ravel(z)
现在xx = ([0, 1, 2, 0, 1, 2]),yy和zz同理。
如果您正在处理此类数据并且数据已经充分采样,则可以使用散点图模拟contourf绘图。这仅在数据集被充分采样以填充所有空间时才有效。
plt.scatter(xx,yy,c=zz,cmap=cm.Reds)
在我看来,你描述的是空间中的一维曲线而不是一个表面。我这样说是因为我假设x[i]
、y[i]
和z[i]
是一个点的坐标。你无法用这些点轻松地定义一个表面,因为你的点只依赖于一个变量i
,所以只描述了一个自由度形状。请考虑到你可以将列表中的每个点连接到下一个点,并且这只会给你一个一维点链。为了从三个数组创建一个表面,你必须定义9个z值,而不是3个。
很抱歉这不是一个有帮助的答案,但我没有足够的声望来发布评论。
你的z
是错误的。它需要在网格的每个点上给出值。如果z
是x
和y
的函数,请计算下面我所称的X_grid
处的z
:
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)
z
值,但是您没有提供这个值,因此除非您告诉我们如何找到缺失的z
值,否则您的问题实际上无法回答...请参考Theo的答案,那更像是一条评论。 - jotasi