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

时间:2016-05-20 01:01:35

标签: python pandas data-visualization

是否可以获得this plot

之类的内容

来自熊猫数据框,其方式类似于我只是做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 
          ...      ...      ...     ...     ...      ...       ... 

我想用

做什么

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

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

我希望我的情节看起来可能不是真正的3D情节,而是覆盖2D地块的某些特殊版本?

我更喜欢这样做

奖励积分:

  • 仅使用python
  • 仅使用pandas和matplotlib
  • 已实施的功能

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

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

matplotlib的图库示例

有什么问题

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

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

1 个答案:

答案 0 :(得分: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()

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

enter image description here