2015-11-27 3 views
1

У меня есть два массива (равной длины), которые определяют длину x- и y-оси.Сделать точку в Python, используя файл данных, который состоит из списка массивов

для например:

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

С этим я могу построить ху-сетку. На каждом бине (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]) 

, но я могу читать данные только как строки не как массивы. Как мне обойти это?

+0

Что значит «читать данные только как линии»? Что вы пытаетесь сделать с этим последним сюжетом? i, v где они определены? Вы пытаетесь показать 3D-сюжет? – tglaria

+0

Привет! Извините, я имел в виду x и y. Да, я хотел бы получить 3D-сюжет или участок с плотностью 2d, подобный этому (https://oceanpython.files.wordpress.com/2013/02/2d_histogram3.png). Я имел в виду, что я не могу получить доступ к значению частоты, соответствующему [x] [y]. Я попробовал следующее: с open ("test_hist.txt", "r") как ins: array = [] для строки во вложенных файлах: array.append (строка) 10 print array [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. Edit: нормально, данные предварительно Binned; после быстрого просмотра 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 Edit 2: фиксированные интервалы оси!

+0

Привет, да, это уже биннированные значения. Его файл массивов, где каждый массив дает частоту появления диапазона значений x и фиксированного значения yvalue. –