从列表列表创建二维直方图

Create 2d histogram from a list of lists

我正在尝试从两个数据数组创建一个二维直方图,一个是带有 y 值范围 (rdata) 的列表,另一个是嵌套列表,其中外部列表​​给出特定时间的强度和内部列表给出了特定时间在其中一个高度范围内的强度。

我正在尝试创建一个 2d 直方图,其范围值位于 y 轴上,强度值位于 x 轴上。我查看了 numpy.histogram2d 文档并尝试从我用更简单的数组创建的模板文件重建这个直方图。

附上代码:

import numpy as np
import file_reader as fr
import matplotlib.pyplot as plt

time = []
rdata = []
intensity = []

fr.file_reader(time, rdata, intensity)
print('TIME DATA:', time)
print('RANGE DATA:', rdata)
print('INTENSITY DATA:', intensity)

range_bins = np.linspace(rdata[0],rdata[1],len(rdata))
intensity_bins = np.linspace(-70,30,len(intensity))
rdata = [rdata]

for i in range((len(time)-1)):
    rdata.append(rdata)

print(rdata)


H, intensity_bins, rdata_bins = np.histogram2d(intensity,rdata,bins=(intensity_bins,range_bins))

X,Y = np.meshgrid(intensity_bins,range_bins)
plt.xlim(intensity_bins[-1])
plt.ylim(range_bins[-1])
plt.pcolormesh(X,Y,H, cmap='Reds')
plt.draw()

file_reader 是我创建的一个文件,用于从 .txt 文件中读取数据,为了简单起见,我将包含该文件的数据输出,它构建了我要绘制的数组:

TIME DATA: [16.23638916015625, 16.23916625976562, 16.24194526672363, 16.24472236633301, 16.24749946594238, 16.25027847290039, 16.25305557250977]
RANGE DATA: [155.89599609375, 187.0751953125, 218.25439453125, 249.43359375, 280.61279296875, 311.7919921875]
INTENSITY DATA: [[nan, nan, nan, nan, nan, nan], [nan, nan, -59.63091278076172, -49.99733352661133, nan, nan], [nan, 4.0, -3.2, -20.0, -20.0, -20.0], [1.1, nan, nan, nan, nan, nan], [nan, nan, -59.63091278076172, -49.99733352661133, nan, nan], [nan, 4.0, -3.2, -20.0, -20.0, -20.0], [5.32, -29.48, -50.0, -32.2, -1.111, -51.3]]

for i in range(len(time)-1) 函数是我测试以查看是否复制范围数据列表使其具有相同的长度并且还包含一组嵌套的列表是否有助于数据输入直方图,但是当我 运行 代码没有输出时,它似乎卡住了,因为我必须按 ctrl+c 来停止代码 运行ning。在这里坐了十分钟,它没有产生任何输出或完成 运行ning,这很可笑,因为这些是小数据数组。

如有任何帮助,我们将不胜感激。

numpy.histogram2D 要求 XY 是每个点的 x 和 y 坐标的一维数组。从您提供的数据输出来看,您的 intensity 数组似乎是二维的。此外,当您 运行 通过 rdata 追加循环时,您正在追加中间值(2D)。我已经通过使用 ravel 函数使 intensity 成为一维数组并使用 repeat 创建 rdata 数组更改了您的代码:

import numpy as np
import matplotlib.pyplot as plt

time =[16.23638916015625, 16.23916625976562, 16.24194526672363,
    16.24472236633301, 16.24749946594238, 16.25027847290039, 16.25305557250977]
rdata=[155.89599609375, 187.0751953125, 218.25439453125, 249.43359375,
    280.61279296875, 311.7919921875]
intensity= [[np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN], 
    [np.NaN, np.NaN, -59.63091278076172, -49.99733352661133, np.NaN, np.NaN], 
    [np.NaN, 4.0, -3.2, -20.0, -20.0, -20.0], [1.1, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN], 
    [np.NaN, np.NaN, -59.63091278076172, -49.99733352661133, np.NaN, np.NaN],
    [np.NaN, 4.0, -3.2, -20.0, -20.0, -20.0], [5.32, -29.48, -50.0, -32.2, -1.111, -51.3]]


range_bins = np.linspace(rdata[0],rdata[-1],len(rdata))
intensity_bins = np.linspace(-70,30,len(intensity))

intensity = np.array(intensity).ravel()

rdata = np.repeat(rdata,len(time))

H, intensity_bins, range_bins = np.histogram2d(intensity,rdata,
    bins=(intensity_bins,range_bins))

plt.imshow(H, interpolation='nearest', origin='low',
    extent=[intensity_bins[0], intensity_bins[-1],range_bins[0], range_bins[-1]])