1

我需要将一些光谱数据绘制为 2D 图像,其中每个数据点对应于具有特定日期/时间的光谱。我需要如下绘制所有光谱: - xx 轴 - 对应于波长 - yy 轴 - 对应于日期/时间 - 强度 - 对应于通量

如果我的数据点在时间上是连续/连续的,我只会使用 matplotlib 的 imshow。但是,不仅这些点在时间上并非都是连续/连续的,而且点之间的时间间隔也很大。

这是一些模拟我所拥有的模拟数据:

import numpy as np

sampleSize = 100

data={}
for time in np.arange(0,5):
    data[time] = np.random.sample(sampleSize)

for time in np.arange(14,20):
    data[time] = np.random.sample(sampleSize)

for time in np.arange(30,40):
    data[time] = np.random.sample(sampleSize)


for time in np.arange(25.5,35.5):
    data[time] = np.random.sample(sampleSize)

for time in np.arange(80,120):
    data[time] = np.random.sample(sampleSize)

如果我只需要打印上述数据子集之一;我会做:

mplt.imshow([data[time] for time in np.arange(0,5)], cmap ='Greys',aspect='auto',origin='lower',interpolation="none",extent=[-50,50,0,5])

mplt.show()

但是,我不知道如何在同一个图中打印所有数据,同时显示间隙并将 yy 轴保持为时间。有任何想法吗?

谢谢,豪尔赫

4

2 回答 2

0

最后我最终使用了不同的方法:

1)重新索引我的数据中的时间,以便没有两个数组具有相同的时间,并且我避免使用非整数索引

nTimes = 1
timeIndexes=[int(float(index)) for index in data.keys()]
while len(timeIndexes) != len(set(timeIndexes)):
    nTimes += 1
    timeIndexes=[int(nTimes*float(index)) for index in data.keys()]

timeIndexesDict = {str(int(nTimes*float(index))):data[index] for index in data.keys()}
lenData2Plot = max([int(key) for key in timeIndexesDict.keys()])

2)创建一个零数组,其中包含我的数据等列数和对应于我的最大重新索引时间的行数

data2Plot = np.zeros((int(lenData2Plot)+1,sampleSize))

3)替换我的零数组中与我的重新确实时间相对应的行

for index in timeIndexesDict.keys():
    data2Plot[int(index)][:] = timeIndexesDict[str(index)]

4)像我通常会绘制一个没有间隙的数组一样绘制

mplt.imshow(data2Plot,
            cmap='Greys',aspect='auto',origin='lower',interpolation="none",
       extent=[-50,50,0,120])
mplt.show()
于 2019-12-05T22:39:30.340 回答
0

或者您可以使用pandas来帮助您对键进行排序,然后reindex

df = pd.DataFrame(data).T
plt.imshow(df.reindex(np.arange(df.index.max())),
           cmap ='Greys',
           aspect='auto',
           origin='lower',
           interpolation="none",
           extent=[-50,50,0,5])

输出:

在此处输入图像描述

于 2019-12-04T16:53:11.463 回答