使用由数组列表组成的数据文件在Python中创建一个点图

时间:2015-11-27 14:04:02

标签: python plot histogram dataformat

我有两个数组(长度相等),用于定义x轴和y轴的长度。

例如:

x_array = np.arange(xmin, xmax, xbins)
y_array = np.arange(ymin, ymax, ybins)

有了这个,我可以绘制一个xy网格。在此网格的每个bin(x_ {i} - x_ {i-1},y_ {i} - y_ {i-1})上,我想要一个数量z的出现频率的点图。我已经知道z的出现频率,但它采用以下格式:  (数组([9460,3,172,76,79,121,201,0,115,0,0,           0,0,0]数组([9460,3,172,76,79,121,201,0,115,0,0,           0,0,0]))

要将此频率绘制在网格顶部,我需要执行以下操作:

for x in x_array:
    for y in y_array:
       plot(x,y,data[x][y])

但我只能将数据作为行而非数组读取。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

  1. 上面的代码段 - (array([455127, 36160,等 - 这是文件的实际文本内容吗?您可以加载

    之类的数据
    import ast
    
    with open('test_hist.txt') as inf:
        # grab the file contents as string
        text = inf.read()
        # make it look like Python instead of PHP
        text = "[" + text.replace('(', '').replace('array', '').replace(')', '') + "]"
        # parse string to data structure
        data = ast.literal_eval(text)
    
  2. 编辑:确定,数据已预先装箱;快速查看matplotlib gallery后,我使用close match to your desired output找到了pyplot.hist2d() function。我们可以修改它以使用您的数据:

    import matplotlib.pyplot as plt
    from matplotlib.colors import LogNorm
    from numpy import arange
    
    height, width = len(data), len(data[0])
    xs, ys, weights = [], [], []
    for yval, row in zip(arange(0., 30., 0.3), data):
        for xval, weight in zip(range(0, 10000, 100), row):
            xs.append(xval)
            ys.append(yval)
            weights.append(weight)
    
    plt.hist2d(xs, ys, bins=[width, height], weights=weights, norm=LogNorm())
    plt.colorbar()
    plt.show()
    

    (在给定的样本数据上)产生 enter image description here 修改2:固定轴范围!