首页 > 解决方案 > 带有多条线的 3d 图,显示 xy 平面上的投影

问题描述

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

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()

在此处输入图像描述

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

标签: matplotlibplotfill

解决方案


在@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()

在此处输入图像描述

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


推荐阅读