【问题标题】:Python - plot numpy array with gaps in the dataPython - 绘制带有数据间隙的numpy数组
【发布时间】:2019-12-04 16:43:19
【问题描述】:

我需要将一些光谱数据绘制为 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 轴保持为时间。有什么想法吗?

谢谢, 豪尔赫

【问题讨论】:

  • imshow 在其像素之间使用相等的间距。您可以改用 pcolormesh 并根据需要定义 x 和 y 数组。
  • @BillChen:请在问题中查看生成的数组
  • @ImportanceOfBeingErnest:很好,谢谢,我去看看。

标签: python matplotlib plot


【解决方案1】:

或者您可以使用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])

输出:

【讨论】:

  • 哼,那也不错。如果键不是整数或负值,它会起作用吗?
  • 可能不适用于非整数,在这种情况下,彩色网格是一个不错的选择。
【解决方案2】:

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

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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-29
    • 2022-01-18
    • 2016-05-07
    • 1970-01-01
    • 2016-02-15
    • 1970-01-01
    • 2020-08-09
    • 2021-06-18
    相关资源
    最近更新 更多