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

基于嵌套字典生成Matplotlib曲面的技术实现问询

基于嵌套字典生成Matplotlib 3D曲面图的实现方法

没问题,我来帮你把这个嵌套字典里的数据转换成Matplotlib的曲面图。首先得明确:Matplotlib的3D曲面图需要两个自变量(比如你的var1和var2)和一个因变量(比如func1或func2的计算结果)。第三个变量var3可以作为参数,生成多张曲面图(每个k对应一张),或者固定某个k值生成单张图。

步骤1:准备依赖库和示例数据

先把必要的库导入,同时用具体数值替代你的占位符,生成可运行的嵌套字典:

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

# 定义你的占位函数
def func1(x,y,z): 
    return x + y/z
def func2(x,y,z): 
    return x/y + z

# 用具体数值生成占位变量(你可以替换成自己的var1/var2/var3)
var1 = np.linspace(1, 5, 5)  # 5个i值
var2 = np.linspace(2, 6, 5)  # 5个j值
var3 = np.linspace(3, 7, 3)  # 3个k值

# 生成你提供的嵌套字典结构
data_bin = {}
for i in var1:
    data_bin[i] = {}
    for j in var2:
        data_bin[i][j] = {}
        for k in var3:
            data_bin[i][j][k] = [func1(i,j,k), func2(i,j,k)]

步骤2:生成单张曲面图(固定k值)

假设我们固定var3中的某个k值,以var1为X轴、var2为Y轴,绘制func1的曲面:

# 选择要固定的k值(比如取var3的第一个元素)
target_k = var3[0]

# 提取X、Y轴的坐标值(排序确保数据有序)
x_values = np.array(sorted(data_bin.keys()))
y_values = np.array(sorted(data_bin[x_values[0]].keys()))

# 生成网格数据(Matplotlib曲面图需要网格形式的X、Y)
X, Y = np.meshgrid(x_values, y_values)

# 初始化数组存储func1的结果
Z_func1 = np.zeros_like(X)
for i_idx, i in enumerate(x_values):
    for j_idx, j in enumerate(y_values):
        # 从字典中取出func1的结果(索引0对应func1)
        Z_func1[j_idx, i_idx] = data_bin[i][j][target_k][0]

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

# 绘制曲面,设置配色和边缘样式
surf = ax.plot_surface(X, Y, Z_func1, cmap='viridis', edgecolor='none')

# 设置坐标轴标签和标题
ax.set_xlabel('i (var1)')
ax.set_ylabel('j (var2)')
ax.set_zlabel('func1(i,j,k)')
ax.set_title(f'Surface Plot of func1 with k = {target_k:.2f}')

# 添加颜色条,对应曲面的数值范围
fig.colorbar(surf, shrink=0.5, aspect=5)

plt.show()

如果要绘制func2的曲面,只需要把代码中的[0]改成[1]即可(因为data_bin[i][j][k][1]对应func2的结果)。

步骤3:生成多张曲面图(展示所有k值)

如果想一次性展示每个k值对应的曲面,可以用子图来实现:

# 创建子图布局,每个k对应一个3D子图
fig, axes = plt.subplots(nrows=1, ncols=len(var3), figsize=(15, 6), subplot_kw={'projection': '3d'})

# 遍历每个k值,生成对应的曲面
for idx, k in enumerate(var3):
    ax = axes[idx]
    # 提取坐标和生成网格
    x_values = np.array(sorted(data_bin.keys()))
    y_values = np.array(sorted(data_bin[x_values[0]].keys()))
    X, Y = np.meshgrid(x_values, y_values)
    
    # 填充func1的结果
    Z_func1 = np.zeros_like(X)
    for i_idx, i in enumerate(x_values):
        for j_idx, j in enumerate(y_values):
            Z_func1[j_idx, i_idx] = data_bin[i][j][k][0]
    
    # 绘制曲面
    surf = ax.plot_surface(X, Y, Z_func1, cmap='viridis', edgecolor='none')
    # 设置子图的标签和标题
    ax.set_xlabel('i')
    ax.set_ylabel('j')
    ax.set_zlabel('func1')
    ax.set_title(f'k = {k:.2f}')

# 统一添加颜色条,适配所有子图
fig.colorbar(surf, ax=axes, shrink=0.6, aspect=10)
plt.tight_layout()
plt.show()

注意事项

  • 如果你的var1/var2/var3是无序的,一定要用sorted()对键排序,否则生成的网格会混乱。
  • 如果你的变量是非数值类型(比如字符串),需要先将其映射为数值才能生成网格。
  • 可以根据需求调整配色方案(比如替换cmap='viridis'为其他Matplotlib配色,如plasma、magma等)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:52:11