如何将含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
相关产品推荐
相关产品推荐

