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

Python 从列表列表创建二维直方图,python,python-3.x,matplotlib,nested-lists,histogram2d,Python,Python 3.x,Matplotlib,Nested Lists,Histogram2d,我试图从两个数据数组中创建一个2d直方图,一个是带有y值范围(rdata)的列表,另一个是嵌套列表,其中外部列表给出特定时间的强度,内部列表给出其中一个高度范围中特定时间的强度 我试图创建一个二维直方图,其中y轴上的范围值和x轴上的强度值。我查看了numpy.historogram2d文档,并尝试从使用Simpler数组创建的模板文件重建此直方图 随函附上代码: import numpy as np import file_reader as fr import matplotlib.pyplo

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

我试图创建一个二维直方图,其中y轴上的范围值和x轴上的强度值。我查看了numpy.historogram2d文档,并尝试从使用Simpler数组创建的模板文件重建此直方图

随函附上代码:

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键才能停止代码运行。在这里坐了十分钟,它没有产生任何输出或完成运行,这很可笑,因为这些都是小数据阵列


任何帮助都将不胜感激。

numpy。Historogram2d
要求
X
Y
为每个点的X和Y坐标的1D数组。从您提供的数据输出来看,您的
强度
阵列似乎是2D。此外,当您运行
rdata
append循环时,您将附加中间值(即2D)。我已通过使用
ravel
函数制作
intensity
1D数组和使用
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]])

numpy。Historogram2d
要求
X
Y
为每个点的X和Y坐标的1D数组。从您提供的数据输出来看,您的
强度
阵列似乎是2D。此外,当您运行
rdata
append循环时,您将附加中间值(即2D)。我已通过使用
ravel
函数制作
intensity
1D数组和使用
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]])

不深入研究,如果将
plt.draw()
替换为
plt.show()
,会发生什么?不深入研究,如果将
plt.draw()
替换为
plt.show()
,会发生什么?通过执行len(time)*rdata以数字顺序获取新的rdata。否则,这对答案很有帮助,谢谢!修正了通过执行len(time)*rdata以数字顺序获取新rdata的问题。否则,这对答案很有帮助,谢谢!