Python 使用不同阵列长度绘制3D熊猫数据框中的光谱数据

Python 使用不同阵列长度绘制3D熊猫数据框中的光谱数据,python,pandas,data-visualization,Python,Pandas,Data Visualization,有可能得到像这样的东西吗 从一个熊猫数据帧,以一种类似于我只需做2d绘图(df.plot())的方式 更准确地说: 我将csv文件中的数据读入具有以下结构的熊猫数据帧: 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

有可能得到像这样的东西吗

从一个熊猫数据帧,以一种类似于我只需做2d绘图(
df.plot()
)的方式

更准确地说: 我将csv文件中的数据读入具有以下结构的熊猫数据帧:

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 
          ...      ...      ...     ...     ...      ...       ... 
我想用它做什么 我想根据索引绘制这些色谱柱(它们是核磁共振谱)。 在二维覆盖中,这是matplotlib周围pandas包装的简单用法。 然而,我想沿着第三个轴绘制每个光谱的“线”,第三个轴的第二级标题如下所示 滴答声。 我尝试使用matplotlib的3D绘图功能,但它似乎只适用于实际具有三个等长数组的情况, 在我的数据中,这是没有意义的,因为每个光谱都是为第二级标题中的一个值记录的

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()
当我试着做一个3D绘图的时候,我是不是想的太复杂了

我想让我的图看起来可能不是一个真实的3D图,而是一些特殊版本的叠加2D图

我想怎么做 奖励积分:

  • 仅使用python
  • 仅使用pandas和matplotlib
  • 已实现的功能
如果没有明显的python方法可以做到这一点,我也会很高兴看到其他语言库也可以做到这一点,比如 R或倍频程。我只是对这些不太熟悉,所以我可能无法适应这些语言中更多的黑客解决方案来满足我的需求

可能非常相似,但据我所知,它不一定扩展到python以外的软件,也没有结果应该是什么样子的示例,因此我不确定这个问题的答案是否真的有助于实现这个特定目的

matplotlib的图库示例有什么问题 正如lanery所指出的,matplotlib图库中的polygon3D接近了我的愿望。 然而,它有一些缺点,其中一些是大多数科学出版物所不能接受的:

  • 如果是负值,整个情节就会变成我想要的样子 称之为“屏幕中间”,这看起来有点难看,让人觉得 很难从图形中提取信息并使其与众不同 根据提供的示例
  • 您将获得交互式绘图窗口,该窗口要求您查找 从这个角度你可以看到你需要看到的一切。那个 可能适用于某些数据探索任务,但如果使用 用于可视化的脚本和对图形的微小更改 将迫使您再次执行一些手动工作,这将降低 您期望从脚本中获得的优势
  • 如果您的值差异很大且不是线性的,那么 像
    [0,1,1.7,2.5,6.2]
    ,对于你的第三维度,也就是第二维度 在这种情况下,2d图的距离非常不同 这是不可接受的,至少对任何人来说都是如此 阅读出版物的非节目观众
  • 对于一个非常普通的绘图操作来说,这是一个相当长且技术性的过程 在光谱学方面。如果我愿意的话,代码的数量是可以的 构建可以在某些上下文中绘制3D绘图的软件。科学it 最好能完成这样的事情 使用少量的代码

我给了您一个使用连续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上的选项来旋转并获得所需的轴。我不太清楚你的最终目标是什么,但这是最后的情节


正如您链接到的帖子中的某个人所指出的,这是一个很好的资源,可以查看您想要的可视化是否/如何实现。通过图库,我想说有两个3D绘图候选,1)和2)。如果我确信这两个例子都是您想要的,我会发布一个答案。是的,matplotlib图库总体上确实很棒。3d多边形绘图非常接近,但有一些东西使它无法用于科学出版物。我将把这些补充到问题中。