如何在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
相关产品推荐
相关产品推荐

