绘制来自不同阵列长度的三维熊猫数据帧的光谱数据

Aar*_*nel 5 python data-visualization pandas

是否有可能获得这样的情节

从熊猫数据框,以类似的方式,我只是做2d-plot(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 
          ...      ...      ...     ...     ...      ...       ... 
Run Code Online (Sandbox Code Playgroud)

我想用它做什么

我想根据指数绘制这些列中的每一列(它们是NMR光谱).在2D叠加层中,这是matplotlib周围的pandas包装器的简单用法.但是,我想将每个光谱绘制在自己的"线"中,沿着第三个轴绘制,其中第二个水平标题为刻度.我尝试使用matplotlib的3D绘图功能,但它似乎只适用于你实际上有三个相等长度的数组,在我的数据的情况下没有意义,因为每个光谱都记录为其中一个来自第二级标题的值.

当我尝试制作3D情节时,我是否认为太复杂了?

这个数字我希望我的情节看起来可能不是一个真正的3D情节,而是一些特殊版本的重叠2D情节?

我多么喜欢这样做

奖励积分:

  • 仅使用python
  • 仅使用pandas和matplotlib
  • 已经实现了功能

如果没有明显的python方法可以做到这一点,我也会对可以做同样的其他语言的库感到高兴,比如R或Octave.我对这些并不熟悉,所以我可能无法在这些语言中调整更多hacky解决方案以满足我的要求.

这个问题可能非常相似,但据我所知,它不一定扩展到除python以外的软件,并且没有结果应该是什么样子的例子,所以我不确定这个问题的答案是否真的可能对这个特定目的有帮助.

matplotlib的图库示例有什么问题

正如lanery指出的那样,来自matplotlib画廊的polygon3D接近我想要的.然而,它有一些缺点,其中一些是大多数科学出版物都不能接受的:

  • 对于负值,整个情节会转移到我称之为"屏幕中间"的位置,这看起来很难看,很难从图中提取信息并使其与提供的示例不同
  • 您将获得该交互式绘图窗口,该窗口需要您找到一个角度,您可以从中查看需要查看的所有内容.这可能对某些数据探索任务有利,但如果您使用脚本进行可视化,并且对图形进行微小更改会迫使您再次进行一些手动操作,这会降低您希望通过脚本编写的优势
  • 如果您的值非常强且且不是线性的,那么[0,1,1.7,2.5,6.2]对于您的第三维,即在这种情况下的第二级标题,2d图与另一个图的距离非常不同,这是不可接受的,至少对于任何非编程受众而言阅读出版物
  • 在光谱学中进行相当普遍的绘图操作是相当长且技术性的.如果我想构建可以在某些上下文中创建3D绘图的软件,那么代码量就可以了.对于科学来说,最好能够用少量代码完成这样的事情.

Jam*_*ale 0

我给了您一个使用连续 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()
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述