我有一些z=f(x,y)数据,我想绘制。问题是(x,y)不是“漂亮”矩形的一部分,而是任意的平行四边形,如所附图像所示(这个特殊的也是矩形,但你可以想到更一般的情况)。所以我很难弄清楚如何在这种情况下使用plot_surface,因为这通常会将x和y作为2d数组,而这里的x和y值是1d。谢谢
z=f(x,y)
(x,y)
plot_surface
tnkciper1#
可以将任意点作为1D数组提供给matplotlib.Axes3D.plot_trisurf。它们是否遵循特定的结构并不重要。取决于数据结构的其他方法可以是
matplotlib.Axes3D.plot_trisurf
scipy.interpolate.griddata
plot_surface()
从sphere example可以看出,plot_surface()也适用于非常不均匀的网格形状,只要它以规则的方式结构。以下是一些例子:
为了完整起见,请在这里找到生成上面图像的代码:
import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D import numpy as np f = lambda x,y: np.sin(x+0.4*y)*0.23+1 fig = plt.figure(figsize=(5,6)) plt.subplots_adjust(left=0.1, top=0.95,wspace=0.01) ax0 = fig.add_subplot(322, projection="3d") ma = 6*(np.random.rand(100)-0.5) mb = 6*(np.random.rand(100)-0.5) phi = np.pi/4 x = 1.7*ma*np.cos(phi) + 1.7*mb*np.sin(phi) y = -1.2*ma*np.sin(phi) +1.2* mb*np.cos(phi) z = f(x,y) ax0.plot_trisurf(x,y,z) ax1 = fig.add_subplot(321) ax0.set_title("random plot_trisurf()") ax1.set_aspect("equal") ax1.scatter(x,y, marker="+", alpha=0.4) for i in range(len(x)): ax1.text(x[i],y[i], i , ha="center", va="center", fontsize=6) n = 10 a = np.linspace(-3, 3, n) ma, mb = np.meshgrid(a,a) phi = np.pi/4 xm = 1.7*ma*np.cos(phi) + 1.7*mb*np.sin(phi) ym = -1.2*ma*np.sin(phi) +1.2* mb*np.cos(phi) shuf = np.c_[xm.flatten(), ym.flatten()] np.random.shuffle(shuf) x = shuf[:,0] y = shuf[:,1] z = f(x,y) ax2 = fig.add_subplot(324, projection="3d") ax2.plot_trisurf(x,y,z) ax3 = fig.add_subplot(323) ax2.set_title("unstructured plot_trisurf()") ax3.set_aspect("equal") ax3.scatter(x,y, marker="+", alpha=0.4) for i in range(len(x)): ax3.text(x[i],y[i], i , ha="center", va="center", fontsize=6) x = xm.flatten() y = ym.flatten() z = f(x,y) X = x.reshape(10,10) Y = y.reshape(10,10) Z = z.reshape(10,10) ax4 = fig.add_subplot(326, projection="3d") ax4.plot_surface(X,Y,Z) ax5 = fig.add_subplot(325) ax4.set_title("regular plot_surf()") ax5.set_aspect("equal") ax5.scatter(x,y, marker="+", alpha=0.4) for i in range(len(x)): ax5.text(x[i],y[i], i , ha="center", va="center", fontsize=6) for axes in [ax0, ax2,ax4]: axes.set_xlim([-3.5,3.5]) axes.set_ylim([-3.5,3.5]) axes.set_zlim([0.9,2.0]) axes.axis("off") plt.savefig(__file__+".png") plt.show()
du7egjpx2#
如果你的数据是有序的,并且你知道parallogram的大小,那么一个reshape可能就足够了:
ax.surface(x.reshape(10, 10), y.reshape(10, 10), z.reshape(10, 10))
如果平行四边形的每边有10个点,并且这些点以锯齿形排列,则可以工作
2条答案
按热度按时间tnkciper1#
可以将任意点作为1D数组提供给
matplotlib.Axes3D.plot_trisurf
。它们是否遵循特定的结构并不重要。取决于数据结构的其他方法可以是
scipy.interpolate.griddata
来实现。参见示例hereplot_surface()
。根据提供点的顺序,对于具有“平行四边形”形状的网格,这可能是非常容易的解决方案。从sphere example可以看出,
plot_surface()
也适用于非常不均匀的网格形状,只要它以规则的方式结构。以下是一些例子:
为了完整起见,请在这里找到生成上面图像的代码:
du7egjpx2#
如果你的数据是有序的,并且你知道parallogram的大小,那么一个reshape可能就足够了:
如果平行四边形的每边有10个点,并且这些点以锯齿形排列,则可以工作