2014-01-31 4 views
1

Я хочу сдвинуть несколько графиков друг под друга. Я прочитал в данных как массив с 4-мя столбцами в данных:Сдвиг нескольких графиков друг под другом

# load data for variable intensities 
data_with_minimum = [] 
for i in [6, 12, 25, 50, 100]: 
    data_with_minimum.append(np.loadtxt('data{0}.dat'.format(i))) 

я искать в характерной точке, в этом случае, как минимум в течение первых 5000 строк (я знаю, что всегда есть минимум) и сохранение индексов.

# open arrays for minimum value and index 
m = [] 
mi = [] 
for k in range(5): 
    m.append(0) 
    mi.append(0) 
    # search minimum in first 5000 data points 
    for i in range(5000): 
     if m[k] > data_with_minimum[k][i,1]: 
      m[k] = data_with_minimum[k][i,1] 
      mi[k] = i 

Наконец, я хочу, чтобы переместить каждый минимум из первого столбца друг под другом:

# shift x-axis 
for i in range(30000 - m_max): 
    for k in range(5): 
     data_with_minimum[k][i,1] = data_with_minimum[k][i+(mi[k]-min(mi)),1] 

К сожалению, это не работает, потому что ценности пересматривают себя. Поскольку я довольно новичок в Python, я застрял. Поэтому любые предложения были бы полезными. Или может быть, в общем, более простой способ решить эту проблему? Мне это кажется неудобным .. Спасибо!

редактировать:

1) К сожалению, я не могу добавлять изображения, потому что я не достаточно очков репутации. Поэтому мне нужно опубликовать эту ссылку shift graphs. Простите за это. Моя цель состоит в том, что минимумы всех графиков находятся в одной и той же точке. Этот график наносили на график с помощью команды:

plt.figure(0) 
for i in range(5): 
    plt.plot(data_with_minimum[i][:,0], data_with_minimum[i][:,1]) 

Минимальный пример данных:

x y(file1) y(file2) y(file3) 
1 5  8  3 
2 3  6  1 
3 1  5  5 
4 2  3  8 
5 5  1  10 
6 8  3  13 
7 10  4  15 
8 14  7  18 
9 16  10  20 
... 

это должно стать

x y(file1) y(file2) y(file3) 
1 3  3  3 
2 1  1  1 
3 2  3  5 
4 5  4  8 
5 8  7  10 
6 10  10  13 
7 14  -  15 
8 16  -  18 
9 -  -  20 
... 

с 1 минимальной. Но стоит упомянуть, что было возможно, что после 5000 первых точек данных существует дополнительный минимум. и начало реальных данных одного файла:

0.000000 -1.057758 
0.000200 -1.051918 
0.000400 -1.063922 
0.000600 -1.065220 
0.000800 -1.069438 
0.001000 -1.065220   
0.001400 -1.065545 
0.001600 -1.077549 
0.001800 -1.072682 
0.002000 -1.082416 
0.002200 -1.078847 
0.002400 -1.090203 
0.002600 -1.087283 
0.002800 -1.095069 
0.003000 -1.090527 
0.003200 -1.098314 
0.003400 -1.100261 
0.003600 -1.108372 
0.003800 -1.103505 
0.004000 -1.111292 
0.004200 -1.107074 
0.004400 -1.113887 
0.004600 -1.112590 
0.004800 -1.127514 
0.005000 -1.115510 
0.005200 -1.127514 
... 

2) изменили столбцы строк в проход «в этом случае, как минимум в первых 5000 столбцов»

+3

Я не очень понимаю, что это значит. Не могли бы вы показать пример, очень небольшой набор данных и желаемый результат для этих данных? –

+1

Вы не имеете в виду первые 5000 * рядов * - Вы, кажется, очень много работаете, смотрите на трюки типа: 'a = [1,2,32,3,1, -4,44]; m = min (a); i = a.Индекс (м); print m, i; ' –

+0

, помимо поиска встроенных элементов, таких как min (a), возможно, посмотрите на массивы numpy, а не на списки, они намного быстрее (вы говорите« открытые массивы для минимального значения и индекса », но вы создаете списки в строке после этого) – usethedeathstar

ответ

0

Прежде всего, вы можете найти минимумы индексов намного проще и быстрее, используя argmin Numpy в:

import numpy 
# setup example data 
x = numpy.arange(9) 
data_with_minimum = numpy.array(
    [[ 5, 3, 1, 2, 5, 8, 10, 14, 16], 
    [ 8, 6, 5, 3, 1, 3, 4, 7, 10], 
    [ 3, 1, 5, 8, 10, 13, 15, 18, 20]]) 

mi = numpy.argmin(data_with_minimum, axis = 1) 

Затем я хотел указать вам на numpy.roll, который может использоваться для смещения/выравнивания массивов, но если вы заинтересованы в построении графика, гораздо более изящно и логично не модифицировать массивы вообще (и решать с пограничными проблемами), а просто переложить участки линии:

import matplotlib.pyplot as plt 

plt.clf() 

for i, row in enumerate(data_with_minimum): 
    plt.plot(x - mi[i], row) 

plt.xlabel('offset from minimum') 
plt.show() 

aligned line plots

0

Это трудно ответить без a MWE. Но вот как я бы построить две линии так, чтобы их минимальные значения были выровнены:

import numpy as np 
np.random.seed(1) 
a = np.random.random_sample(10) 
b = np.random.random_sample(10) 

# say we want to align "b" to "a" based on 
# the minima as you describe 
a_indices = np.arange(0, len(a)) 
b_indices = a_indices + (a.argmin() - b.argmin()) 

import matplotlib.pyplot as plt 
plt.plot(a_indices, a) 
plt.plot(b_indices, b) 
plt.show() 

enter image description here

Смежные вопросы