自定义函数绘制分段3D图形,解决Matplotlib z需为2D数组报错问题
问题解决方法
报错的核心原因是你传入contour3D的z值不是要求的二维数组,问题出在封装的函数逻辑错误:
- 自定义的
fun函数没有返回有效的二维数组,甚至内部把函数名作为变量覆盖,执行完没有有效返回值 - 给定的单值计算
func函数需要配合二维坐标遍历,才能生成符合要求的z矩阵
修改后的完整可运行代码
import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # 导入给定的func函数,仅去掉返回值外层多余的列表包裹,保留核心计算逻辑 def func(x,y): if x < 0: return np.sin(x+y) elif x > 0: return np.cos(x+y) else: return 0 # 生成x、y坐标数组 x = np.linspace(-1, 1, 21) y = np.linspace(-1, 1, 21) # 封装逻辑生成符合绘图要求的二维z数组 def generate_z(x_arr, y_arr): z = [] for i in x_arr: row_z = [] for j in y_arr: row_z.append(func(i, j)) z.append(row_z) return np.array(z) # 3D绘图逻辑 fig = plt.figure(figsize=(5, 6)) ax = fig.add_subplot(111, projection='3d') z = generate_z(x, y) ax.contour3D(x, y, z, 10, cmap='inferno') plt.show()
关键修改说明
- 保留了给定的
func单值计算逻辑,仅去掉返回值外层多余的列表,避免生成嵌套结构 - 单独封装
generate_z函数遍历x、y数组,调用func计算每个坐标点的z值,最终返回标准二维numpy数组,匹配绘图接口要求 - 修复了原代码
plt.show缺少括号的问题,避免绘图无法正常显示
内容的提问来源于stack exchange,提问作者Zeke
相关产品推荐
相关产品推荐

