使用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
相关产品推荐
相关产品推荐

