Topspin导出适配格式数据并通过Python绘制可调轴2D等高线图
解决Topspin导出2D数据并Python绘制可调整坐标轴的等高线图
一、Topspin正确导出带坐标轴信息的方法
你之前导出的只有Z值是因为选了仅矩阵的格式,要导出包含X/Y轴刻度的文件,按以下步骤操作:
- 右键拖拽选框选中目标2D区域
- 方式1:菜单栏
File > Save > Save as ASCII,在保存对话框里选**「Matrix with axes」**(部分版本叫「ASCII with axis info」),指定文件名保存 - 方式2:Topspin命令行输入(已选中区域时):
这个命令会直接输出包含X/Y轴范围、点数和Z矩阵的文本文件write2d axis=both file=your_output.txt
二、Python绘图代码(适配导出数据)
情况1:导出文件含轴参数+Z矩阵(推荐)
这种格式开头两行是X/Y的起始、终止、点数,后面是Z的二维数组,用下面的代码读取和绘图:
import numpy as np import matplotlib.pyplot as plt def load_topspin_data(file_path): with open(file_path, 'r') as f: # 读取X轴参数 x_start, x_end, x_n = map(float, f.readline().split()) # 读取Y轴参数 y_start, y_end, y_n = map(float, f.readline().split()) # 读取Z矩阵 z = np.loadtxt(f) # 生成网格 x = np.linspace(x_start, x_end, int(x_n)) y = np.linspace(y_start, y_end, int(y_n)) X, Y = np.meshgrid(x, y) return X, Y, z # 加载数据 X, Y, Z = load_topspin_data('your_output.txt') # 绘制等高线图 fig, ax = plt.subplots(figsize=(8, 6)) contour_plot = ax.contourf(X, Y, Z, cmap='viridis') plt.colorbar(contour_plot, label='Signal Intensity') # 调整坐标轴范围(自定义子区域) # 示例:X轴限制在10-20 ppm,Y轴限制在5-15 ppm ax.set_xlim(10, 20) ax.set_ylim(5, 15) # 设置标签 ax.set_xlabel('X Axis (ppm)') ax.set_ylabel('Y Axis (ppm)') ax.set_title('2D NMR Contour Plot') plt.show()
情况2:导出文件为X/Y/Z三列格式
如果导出的是每行一个(X,Y,Z)点的文本,用以下代码处理:
import numpy as np import matplotlib.pyplot as plt # 读取三列数据 data = np.loadtxt('your_output.txt') x_vals = data[:, 0] y_vals = data[:, 1] z_vals = data[:, 2] # 生成规则网格 x_unique = np.unique(x_vals) y_unique = np.unique(y_vals) X, Y = np.meshgrid(x_unique, y_unique) Z = z_vals.reshape(len(y_unique), len(x_unique)) # 绘图部分和上面一致 fig, ax = plt.subplots(figsize=(8, 6)) contour_plot = ax.contourf(X, Y, Z, cmap='viridis') plt.colorbar(contour_plot, label='Signal Intensity') # 调整子区域 ax.set_xlim(x_unique.min(), x_unique.max()) # 替换为你需要的范围 ax.set_ylim(y_unique.min(), y_unique.max()) ax.set_xlabel('X Axis (ppm)') ax.set_ylabel('Y Axis (ppm)') ax.set_title('2D NMR Contour Plot') plt.show()
三、关键注意事项
- 务必确认导出时勾选了包含坐标轴信息的选项,不要选仅Z矩阵的格式
- 如果绘图时坐标轴方向不对,可对Z矩阵做转置(
Z = Z.T)调整 set_xlim()和set_ylim()的参数直接替换成你需要的子区域范围即可
内容的提问来源于stack exchange,提问作者coffeedealer
相关产品推荐
相关产品推荐

