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

如何将含100个pandas DataFrame的字典数据绘制成3D图?

实现3D吸收度分布图的解决方案

步骤1:整合所有数据到统一数据集

先给每个DataFrame加上对应的Y位置标签,再合并成一个包含X、Y、Absorption三列的大DataFrame。

  • 如果字典的键就是Y位置值(比如0、100、200…单位μm),直接用键作为Y值;
  • 如果字典键是索引,就按步长100μm生成Y位置数组。

示例代码:

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

# 假设你的字典名为df_dict
df_list = []
# 情况1:字典键是Y位置值
for y_val, df in df_dict.items():
    df['Y'] = y_val
    df_list.append(df)

# 情况2:字典键是索引,生成Y位置数组
# y_positions = np.arange(0, 100*100, 100)  # 100个位置,从0到9900μm
# for idx, (key, df) in enumerate(df_dict.items()):
#     df['Y'] = y_positions[idx]
#     df_list.append(df)

# 合并成总数据集
combined_df = pd.concat(df_list, ignore_index=True)

步骤2:绘制3D可视化图

根据需求选择两种常见的可视化方式:

方式1:3D线图(清晰展示单Y位置的X-吸收度分布)

适合观察每个Y位置上吸收度沿X轴的变化趋势,同时在Y轴维度区分不同位置:

fig = plt.figure(figsize=(12,8))
ax = fig.add_subplot(111, projection='3d')

# 按Y位置分组绘制曲线
for y_val, group in combined_df.groupby('Y'):
    ax.plot(group['X'], group['Y'], group['Absorption'], linewidth=0.8)

ax.set_xlabel('X Position')
ax.set_ylabel('Y Position (μm)')
ax.set_zlabel('Absorption')
ax.set_title('3D Absorption Distribution')
plt.show()

如果100条曲线过于拥挤,可以用颜色渐变区分Y位置:

norm = plt.Normalize(combined_df['Y'].min(), combined_df['Y'].max())
cmap = plt.cm.viridis

fig = plt.figure(figsize=(12,8))
ax = fig.add_subplot(111, projection='3d')

for y_val, group in combined_df.groupby('Y'):
    color = cmap(norm(y_val))
    ax.plot(group['X'], group['Y'], group['Absorption'], color=color, linewidth=0.8)

# 添加颜色条映射Y位置
sm = plt.cm.ScalarMappable(cmap=cmap, norm=norm)
sm.set_array([])
fig.colorbar(sm, ax=ax, label='Y Position (μm)')

ax.set_xlabel('X Position')
ax.set_ylabel('Y Position (μm)')
ax.set_zlabel('Absorption')
ax.set_title('3D Absorption Distribution (Color-Coded by Y)')
plt.show()

方式2:3D曲面图(直观展示整体吸收度热力分布)

如果所有Y位置的X取值完全一致,可将数据转换为网格形式绘制曲面图:

# 提取X、Y网格
x_vals = combined_df['X'].unique()
y_vals = combined_df['Y'].unique()
X, Y = np.meshgrid(x_vals, y_vals)

# 将吸收度转换为二维数组
Z = combined_df.pivot(index='Y', columns='X', values='Absorption').values

fig = plt.figure(figsize=(12,8))
ax = fig.add_subplot(111, projection='3d')
surf = ax.plot_surface(X, Y, Z, cmap='viridis', edgecolor='none', alpha=0.8)

ax.set_xlabel('X Position')
ax.set_ylabel('Y Position (μm)')
ax.set_zlabel('Absorption')
ax.set_title('3D Absorption Surface Map')
fig.colorbar(surf, shrink=0.5, aspect=5, label='Absorption')
plt.show()

注意事项

  • 若不同Y位置的X取值不一致,曲面图无法直接生成,建议先对X值做插值补全,或优先选择3D线图;
  • 可根据需求调整图的尺寸、颜色映射、线条粗细等参数,优化可视化效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 08:07:06