以不同数组长度绘制来自 pandas 数据帧的 3D 光谱数据

2024-04-02

是否有可能得到类似的东西这个情节 https://www.researchgate.net/figure/7662272_fig1_Figure-4-3D-overlay-zoom-plot-of-mass-spectra-of-a-serum-sample-from-one-person

来自 pandas 数据框,以类似于我简单地做 2d 绘图的方式(df.plot())?

更确切地说:

我有从 csv 文件读取到 pandas DataFrames 的数据,其结构如下:

1st level header        A        B       C       D        E         F 
2nd level header      2.0      1.0     0.2     0.4      0.6       0.8

        Index                                                      
     126.4348  -467048  -814795  301388  298430  -187654  -1903170 
     126.4310  -468329  -810060  304366  305343  -192035  -1881625 
     126.4272  -469209  -804697  305795  312472  -197013  -1854848 
     126.4234  -469685  -799604  305647  318936  -200957  -1827665 
     126.4195  -469795  -795708  304101  323922  -202192  -1805153 
     126.4157  -469610  -793795  301497  326780  -199323  -1791743 
     126.4119  -469213  -794362  298257  327092  -191547  -1790418 
     126.4081  -468687  -797499  294817  324717  -178875  -1802122 
     126.4043  -468097  -802853  291546  319800  -162225  -1825540 
     126.4005  -467486  -809663  288700  312745  -143334  -1857270 
     126.3967  -466863  -816878  286401  304170  -124505  -1892389 
     126.3929  -466210  -823335  284645  294827  -108228  -1925312 
     126.3890  -465485  -827966  283331  285520   -96733  -1950795 
     126.3852  -464637  -829997  282315  277018   -91559  -1964894 
     126.3814  -463617  -829104  281457  269965   -93242  -1965702 
     126.3776  -462399  -825487  280670  264824  -101170  -1953728 
     126.3738  -460982  -819857  279942  261819  -113660  -1931820 
     126.3700  -459408  -813317  279344  260927  -128242  -1904669 
     126.3662  -457757  -807177  279009  261885  -142112  -1877955 
     126.3624  -456143  -802715  279090  264233  -152667  -1857303 
     126.3585  -454700  -800940  279722  267380  -158023  -1847241 
     126.3547  -453566  -802397  280969  270692  -157406  -1850358 
     126.3509  -452862  -807050  282792  273579  -151350  -1866803 
     126.3471  -452672  -814262  285033  275591  -141627  -1894249 
     126.3433  -453030  -822898  287426  276486  -130942  -1928303 
     126.3395  -453910  -831501  289627  276273  -122426  -1963297 
     126.3357  -455223  -838544  291266  275222  -119021  -1993312 
     126.3319  -456834  -842695  292004  273824  -122882  -2013246 
     126.3280  -458571  -843048  291599  272725  -134907  -2019718 
     126.3242  -460252  -839292  289952  272620  -154497  -2011656 
          ...      ...      ...     ...     ...      ...       ... 

我想用它做什么

我想根据索引绘制每一列(它们是核磁共振谱)。 在 2D 叠加中,这是围绕 matplotlib 的 pandas 包装器的简单用法。 但是,我想沿着第三个轴将每个频谱绘制在自己的“线”中,该轴的第二级标题为 滴答声。 我尝试使用 matplotlib 的 3D 绘图功能,但它似乎只适用于您实际上拥有三个长度相等的数组, 对于我的数据来说,这没有意义,因为每个频谱都是为第二级标头中的值之一记录的。

当我尝试制作 3D 绘图时,我是否想得太复杂了?

我希望我的绘图看起来不是实际的 3D 绘图,而是叠加 2D 绘图的某种特殊版本?

我更愿意怎样做

奖励积分:

  • 仅使用Python
  • 仅使用 pandas 和 matplotlib
  • 已经实现的功能

如果没有明显的 python 方法来做到这一点,我也会很高兴其他语言的库可以做到这一点,例如 R 或八度。我只是对这些不太熟悉,所以我可能无法在这些语言中采用更多的 hacky 解决方案来满足我的要求。

这个问题 https://stackoverflow.com/questions/31254758/plotting-large-pandas-data-frame-in-3d可能非常相似,但据我了解,它不一定扩展到Python以外的软件,并且没有结果应该是什么样子的示例,所以我不确定这个问题的答案是否真的有帮助为了这个特定的目的。

matplotlib 的画廊示例有什么问题

正如lanery 指出的那样,matplotlib 库中的 Polygon3D 非常接近我的愿望。 然而它有一些缺点,其中一些对于大多数科学出版物来说是不可接受的:

  • 有了负值,整个情节就会转变为我想要的 调用“屏幕中间”,看起来有点难看,使得 很难从图中提取信息并使其与众不同 从提供的例子
  • 您会看到交互式绘图窗口,这需要您找到一个 您可以看到您需要看到的一切的角度。那 可能适合某些数据探索任务,但如果您使用 用于可视化的脚本和对图形的微小更改 会迫使你再次做一些手工工作,这会减少 您期望从脚本编写中获得的优势
  • 如果你的值差异很大并且不是线性的,那么有些东西 喜欢[0,1,1.7,2.5,6.2],对于你的第三个维度,即第二个维度 在这种情况下,水平标题,二维图的距离非常不同 来自另一个人,这是不可接受的,至少对于任何人来说 阅读出版物的非编程受众
  • 对于一个相当常见的绘图操作来说,它是相当长和技术性的 在光谱学中。如果我愿意的话,代码量就可以了 构建可以在某些情况下绘制 3D 绘图的软件。对于科学来说 最好能够完成这样的事情 代码量少。

我给了您一个使用连续 X 和 Y 的数据进行绘图的示例,以及基于第二级标头的硬编码 z。

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

df = pd.read_csv("C:\Users\User\SkyDrive\Documents\import_data.tcsv.txt",header=None)

fig = plt.figure()
ax = fig.gca(projection='3d')

# Plot a sin curve using the x and y axes.
x = df[0]
ax.plot(x, df[1], zs=2, zdir='z', label='A')
ax.plot(x, df[2], zs=1, zdir='z', label='B')
ax.plot(x, df[3], zs=0.2, zdir='z', label='C')
ax.plot(x, df[4], zs=0.4, zdir='z', label='D')
ax.plot(x, df[5], zs=0.6, zdir='z', label='E')
ax.plot(x, df[6], zs=0.8, zdir='z', label='F')

# Customize the view angle so it's easier to see that the scatter points lie
# on the plane y=0
ax.view_init(elev=-150., azim=40)

plt.show()

您必须使用 view_init 上的选项来旋转并获得您想要的轴。我不太清楚你的最终目标是什么,但这就是最终情节。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

以不同数组长度绘制来自 pandas 数据帧的 3D 光谱数据 的相关文章

随机推荐