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

如何基于Python字典存储的XYZ值使用matplotlib生成3D绘图

实现方案

首先修正现有代码的两个核心问题:

  1. np.arange是左闭右开区间,你原来的写法会漏掉x=2和y=2两个端点
  2. 嵌套字典转Z网格可以用向量化函数或者直接构造二维数组两种Pythonic方式实现
import numpy as np
import matplotlib.pyplot as plt

# 原始数据字典
my_dict = {
-2:{0:1,1:1,2:0},
-1:{0:3,1:1,2:0},
 0:{0:6,1:1,2:9},
 1:{0:-2,1:1,2:2},
 2:{0:1,1:1,2:6}}

# 直接从字典提取取值范围,避免手动写范围出错
x = np.array(sorted(my_dict.keys()))
y = np.array(sorted(my_dict[x[0]].keys()))
X, Y = np.meshgrid(x, y)

# 生成Z的两种方案选其一即可
# 方案A:列表推导式构造Z数组,简单直接效率高
Z = np.array([[my_dict[x_val][y_val] for x_val in x] for y_val in y])

# 方案B:实现你需要的f函数,用numpy向量化处理,适合需要多次调用的场景
# @np.vectorize
# def f(x_val, y_val):
#     return my_dict[int(x_val)][int(y_val)]
# Z = f(X,Y)

# 绘图部分
fig = plt.figure()
ax = plt.axes(projection='3d')
ax.contour3D(X, Y, Z, 50, cmap='binary')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
plt.show()

补充说明

  • 如果一定要手动指定x、y的取值范围,把原来的x = np.arange(-2, 2, 1)改为x = np.arange(-2, 3, 1),y = np.arange(0, 2, 1)改为y = np.arange(0, 3, 1)即可
  • 用np.vectorize装饰的函数本质是循环调用,性能和列表推导差不多,胜在调用方式符合你原来的代码习惯
  • 直接从字典键提取取值范围的写法鲁棒性更高,后续修改字典的x、y取值范围不需要调整绘图代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 06:06:02