You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Matplotlib 3D多线图中用类fill_between效果实现XY平面投影填充

实现3D曲线与XY平面投影间的填充阴影

当然有办法实现这个需求!其实你可以利用matplotlib的Poly3DCollection来创建曲线和其XY平面投影之间的填充面,效果类似3D版本的fill_between。下面是修改后的完整代码,我会一步步解释关键部分:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.art3d import Poly3DCollection

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
    
    # 保持你原本的z函数逻辑
    def z_func(x, y, z):
        return x + y**2 + 0.5*z
    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])
    
    # 绘制原始3D曲线
    ax.plot(x1, y1, z1, color='darkblue', linewidth=1.5)
    
    # 生成曲线在XY平面的投影点(z坐标设为0)
    z_proj = np.zeros_like(z1)
    
    # 构造填充面的顶点集:拼接原始曲线点与逆序的投影点,形成闭合区域
    curve_points = np.column_stack((x1, y1, z1))
    proj_points = np.column_stack((x1[::-1], y1[::-1], z_proj[::-1]))
    fill_vertices = np.vstack([curve_points, proj_points])
    
    # 创建填充面并添加到3D轴上
    fill_poly = Poly3DCollection([fill_vertices], alpha=0.3, facecolor='skyblue', edgecolor='lightblue')
    ax.add_collection3d(fill_poly)

ax.view_init(azim=10, elev=20)
# 添加坐标轴标签让图表更清晰
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
plt.show()

关键步骤说明:

  • 导入Poly3DCollection:这是matplotlib中专门用于绘制3D多边形填充面的工具,是实现这个需求的核心。
  • 生成投影点:将原始曲线的z坐标替换为0,得到它在XY平面的投影曲线。
  • 构造闭合顶点集:把原始曲线的点和逆序的投影点拼接起来,这样就能形成一个从曲线起点到终点,再从投影终点回到起点的闭合区域,这是填充的关键。
  • 自定义填充样式:通过alpha参数调整透明度(避免遮挡后面的曲线),facecolor设置填充颜色,edgecolor添加边缘线增强轮廓感。

你还可以根据需求进一步优化,比如:

  • 给不同i值的填充面设置渐变颜色(比如用cmap映射i值)
  • 调整填充面的透明度让重叠区域更自然
  • 修改边缘线的宽度和颜色来突出轮廓

内容的提问来源于stack exchange,提问作者user50473

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:29:45