具有多条线的 3d 图显示在 xy 平面上的投影

3d plot with multiple lines showing the projection on the xy plane

我想知道如何通过类似 fill_between 但在 3D 中的方式制作多条线的 3d 图,显示 xy 平面上的投影。我这里有一个示例代码。

fig, ax = plt.subplots(figsize=(12,8),subplot_kw={'projection': '3d'})

for i in np.arange(0.0,1,0.1):
    x1=np.arange(0,1-i+0.01,0.01)
    y1=1.0-i-x1
    def z_func(x,y,z):
        return x+y**2+0.5*z #can be any fn
    coordinates3= [[i,j,1-i-j] for j in np.arange(0,1-i+0.01,0.01)]
    z1=np.array([z_func(*k) for k in coordinates3])
    ax.plot(x1,y1,z1)

ax.view_init(azim=10,elev=20)
plt.show()

我希望每条线 'projected' 位于 xy 平面上,并在曲线及其投影之间填充阴影。有谁知道快速的方法吗?

在@ImportanceOfBeingErnest 的评论中提出建议后,我能够编写一个解决方案。我想到了这个:

fig, ax = plt.subplots(figsize=(12,8),subplot_kw={'projection': '3d'})

prop_cycle = plt.rcParams['axes.prop_cycle']
colors = prop_cycle.by_key()['color']

for color,i in enumerate(np.arange(0.0,1,0.1)):
    x1=np.arange(0,1-i+0.01,0.01)
    y1=1.0-i-x1
    def z_func(x,y,z):
        return x+y**2+0.5*z #can be any fn
    coordinates3= [[i,j,1-i-j] for j in np.arange(0,1-i+0.01,0.01)]
    z1=np.array([z_func(*k) for k in coordinates3])
    verts=[[(k[1],k[2],z_func(*k)) for k in coordinates3]]
    verts[0].insert(0,(coordinates3[0][1],coordinates3[0][2],0))
    verts[0].insert(0,(coordinates3[-1][1],coordinates3[-1][2],0))
    poly = Poly3DCollection(verts,color=colors[color])
    poly.set_alpha(0.2)
    ax.add_collection(poly)
    ax.plot(x1,y1,z1,linewidth=10)

ax.view_init(azim=10,elev=20)
plt.show()

让我困惑的一件事是阴影没有得到线条的颜色,我不得不自己提供。如果你删除 Poly3DCollection 中的 color=colors[color] 你总是会得到蓝色阴影,而线条会自动获得不同的颜色,正如你在问题中看到的那样。有人知道这是什么原因吗?