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

使用Pandas DataFrames绘制2D Contourf与3D数据遇障求助

解决时间分辨PXRD数据可视化的轴方向问题及3D图绘制

问题根源分析

你当前遇到的contourf轴方向错误,核心原因是数据维度与坐标轴的对应关系搞反了:

  • 你的DataFrame形状是(1027,281):行对应衍射角度(你想要的x轴),列对应时间(你想要的y轴)
  • 但z = dftest.values得到的数组形状是[衍射角度数, 时间点数],而matplotlib的contourf要求z的形状必须是[y轴维度, x轴维度](也就是[时间点数, 衍射角度数]),所以只需要对z做转置操作就能修正轴方向。

修正后的2D Contourf代码

下面是调整轴方向后的完整代码,我优化了变量命名让逻辑更清晰:

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

# 明确坐标轴变量:衍射角度做x轴,时间做y轴
x_theta = dftest.index.values
y_time = dftest.columns.values
# 转置z数据,让形状变为(281, 1027) → 匹配[y轴点数, x轴点数]的要求
z = dftest.values.T

# 创建网格(注意meshgrid的输入顺序:先x轴数据,后y轴数据)
X, Y = np.meshgrid(x_theta, y_time)

# 保留你原来的数据掩码处理逻辑
z_masked = np.ma.array(z)
z_masked = np.ma.masked_where(z_masked > 300, z_masked)
z_masked = np.ma.masked_where(z_masked < -5, z_masked)
z_filled = np.ma.filled(z_masked, fill_value=0)

# 绘制contourf
plt.figure(figsize=(10,6))
contour_plot = plt.contourf(X, Y, z_filled, 20, cmap='jet')
plt.colorbar(contour_plot, label='衍射强度')
plt.xlabel('衍射角度')
plt.ylabel('时间')
plt.ylim(ymax=175000)  # 对应你原来的xmax设置,现在是y轴的上限
plt.yticks(np.arange(0, 175000, step=50000))
plt.title('时间分辨PXRD 2D等高线图')
plt.show()

简便的3D曲面/等高线图绘制

基于修正后的变量,只需要借助Axes3D模块就能快速实现3D可视化,这里提供两种常用方案:

方案1:3D曲面图

from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure(figsize=(12,8))
ax = fig.add_subplot(111, projection='3d')
# rstride和cstride控制网格线密度,数值越大网格越稀疏
surf = ax.plot_surface(X, Y, z_filled, cmap='jet', rstride=5, cstride=5, alpha=0.8)
ax.set_xlabel('衍射角度')
ax.set_ylabel('时间')
ax.set_zlabel('衍射强度')
ax.set_title('时间分辨PXRD 3D曲面图')
fig.colorbar(surf, shrink=0.5, aspect=5)
plt.show()

方案2:3D等高线图

from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure(figsize=(12,8))
ax = fig.add_subplot(111, projection='3d')
# levels参数控制等高线的数量
contour3d = ax.contour3D(X, Y, z_filled, 20, cmap='jet')
ax.set_xlabel('衍射角度')
ax.set_ylabel('时间')
ax.set_zlabel('衍射强度')
ax.set_title('时间分辨PXRD 3D等高线图')
fig.colorbar(contour3d, shrink=0.5, aspect=5)
plt.show()

关键注意点

  • 始终记住:contourf和3D绘图函数中,z数组的形状必须与(X,Y)网格的维度完全匹配,也就是z.shape == Y.shape(Y是meshgrid生成的y轴网格,形状为[y点数, x点数])
  • 转置操作.T是解决你当前轴方向错误的核心,它直接互换了原数据的行和列维度,让时间维度对应y轴、衍射角度维度对应x轴

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:02:03