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

如何在Python中用纹理填充Matplotlib 3D曲线间区域

Matplotlib 3D绘图中用纹理填充两条曲线间区域的解决方案

在Matplotlib的3D绘图中,直接使用Poly3DCollection的hatch参数填充两条曲线间区域会失效——因为Matplotlib的3D集合组件不支持2D的hatch纹理特性,仅能通过color参数实现单色填充。以下是两种可行的替代方案:

方案1:用线条模拟纹理(直观易实现)

通过在填充区域内绘制大量重复的交叉线条,模拟hatch纹理(如x形)的视觉效果:

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

# 生成示例3D曲线数据
x = np.linspace(0, 5, 100)
y1 = np.sin(x)
y2 = np.sin(x) + 0.5
z = x  # 3D z轴坐标

# 创建3D绘图轴
fig = plt.figure(figsize=(10, 6))
ax = fig.add_subplot(111, projection='3d')

# 绘制两条原始曲线
ax.plot(x, y1, z, color='black', linewidth=1.5)
ax.plot(x, y2, z, color='black', linewidth=1.5)

# 模拟"x"形纹理:绘制两组交叉斜线
num_hatch_lines = 40  # 数值越大纹理越密
for t in np.linspace(0, 1, num_hatch_lines):
    # 第一组斜线:从y1到y2的线性插值
    y_mid1 = y1 + t * (y2 - y1)
    ax.plot(x, y_mid1, z, color='orange', linewidth=0.5)
    # 第二组斜线:从y2到y1的线性插值(交叉形成x形)
    y_mid2 = y2 - t * (y2 - y1)
    ax.plot(x, y_mid2, z, color='orange', linewidth=0.5)

# 设置坐标轴标签
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')

plt.show()

方案2:用颜色映射模拟纹理

通过生成自定义纹理图案的颜色数组,结合plot_surface实现类似hatch的填充效果:

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

# 生成示例数据
x = np.linspace(0, 5, 100)
y1 = np.sin(x)
y2 = np.sin(x) + 0.5
z = x

# 创建x形纹理图案
texture_size = 10
texture = np.zeros((texture_size, texture_size))
for i in range(texture_size):
    texture[i, i] = 1
    texture[i, texture_size-1 - i] = 1

# 创建填充区域的网格
X, Z_grid = np.meshgrid(x, z)
Y_grid = np.linspace(y1, y2, texture_size).T

# 将纹理图案扩展到整个填充区域并映射为橙色系
facecolors = np.tile(texture, (len(x), len(z)//texture_size + 1))[:len(x), :len(z)]
facecolors = plt.cm.Oranges(facecolors)

# 绘图
fig = plt.figure(figsize=(10, 6))
ax = fig.add_subplot(111, projection='3d')

# 绘制带纹理的曲面
ax.plot_surface(X, Y_grid, Z_grid, facecolors=facecolors, edgecolor='orange', linewidth=0.2)

# 绘制原始曲线
ax.plot(x, y1, z, color='black', linewidth=1.5)
ax.plot(x, y2, z, color='black', linewidth=1.5)

ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')

plt.show()

补充说明

Matplotlib的3D渲染引擎并未原生实现hatch参数支持,因此直接在Poly3DCollection中设置hatch不会生效。上述两种方案通过模拟方式实现了纹理填充的视觉效果,可根据需求选择使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 07:45:35