如何基于Python字典存储的XYZ值使用matplotlib生成3D绘图
实现方案
首先修正现有代码的两个核心问题:
np.arange是左闭右开区间,你原来的写法会漏掉x=2和y=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
相关产品推荐
相关产品推荐

