2015-01-28 3 views
1

Привет, я использую GNUPLOT для построения данных моделирования структурированных в блоках данных, как это:Gnuplot усреднения стохастических блоков данных в реальном времени через заданные промежутки времени

CurrentTime CurrentState 
0   2 
1.234  2 
1.990  1 
2.462  0 


CurrentTime CurrentState 
0   2 
0.895  1 
1.456  2 
2.052  1 
3.017  0 

Число блоков данных не является строго известных но составляет не менее 30 блоков. Обратите внимание, что количество интервалов различно для каждого CurrentTime. Я использую следующий код для построения данных как

# GNUPlot code 
set multiplot layout 2,1 title "Insert title" font ",14" 
set tmargin 3 
set bmargin 3 
set lmargin 5 
set rmargin 2 
plot "data.txt" every :1 using 1:2:(column(-2)) with linespoints lc variable 

Следующая вещь, которую я хочу построить будет идти в нижнем участке за счет Multiplot команды. Этот сюжет я хочу быть средним из моих данных с промежутками времени, которые я установил. В псевдокоде я хочу:

# pseudo code 
float start, step, stop; 
assign start, step, stop; 
define Interval=start, by step, to stop; typed another way Interval=start:step:stop 
array sum(size(number of data blocks,length(Interval), length(Interval))) 
assign sum=0; 
for every data block 
    for k=0 to length(CurrentTime) 
     for j=0 to length(Interval)-1 
      (CurrentTime(k) < Interval(j+1) && CurrentTime(k) > Interval(j-1)) ? sum += CurrentState(k) : sum += 0 
average=sum/(Number of data blocks) 

Я застрял пытается осуществить это в Gnuplot. Любая помощь была бы потрясающей!

+0

Gnuplot - это программа построения графиков, а не численный инструмент. Используйте октавы, максимумы, scilab, python или что-то еще для таких задач. Это можно сделать «на лету» с синтаксисом типа «plot» Christoph

+1

Спасибо. Я принял ваше предложение и покажу свое решение, если кто-то найдет его полезным. – betafractal

ответ

1

Сначала есть файл данные, некоторые из моих реальных данных

CurrentTime CurrentState 
0  2 
4.36393  1 
5.76339  2 
13.752  1 
13.7645  2 
18.2609  1 
19.9713  2 
33.7285  1 
33.789  0 


CurrentTime CurrentState 
0  2 
3.27887  1 
3.74072  2 
3.86885  1 
4.97116  0 


CurrentTime CurrentState 
0  2 
1.19854  1 
3.23982  2 
7.30501  1 
7.83872  0 

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

#Loading data file: Goal is to calculate average(TimeIntervals)=averageOfTimeIntervals. 
import numpy as np 
data=np.genfromtxt('data.txt', comments='C') 
CurrentState=data[:,1] 
CurrentTime=data[:,0] 
numberTimeIntervals=101 
TimeIntervals=np.linspace(0,numberTimeIntervals-1,numberTimeIntervals)  #gives integer values of time 
stateOfTimeIntervals=np.zeros(numberTimeIntervals,dtype=np.float64) 
stateOfTimeIntervals[0]=CurrentState[0] #setting initial state 
#main loop 
run=0 
numberSimTimes=len(CurrentTime) 
for j in range(0,len(stateOfTimeIntervals)): #start at 1 b/c we know initial state 
for k in range(0,numberSimTimes-1): 
    lengthThisRun=0 
    if CurrentTime[k] <= TimeIntervals[j] and CurrentTime[k+1] > TimeIntervals[j]: 
     lengthThisRun+=1 
     #Goal is to get the length of this run up to the time we decide to check the state 
     stateOfTimeIntervals[j]+=CurrentState[k] 
else: 
     lengthThisRun+=1 
#The number of runs can be claculated using 
numberRuns=len(CurrentTime) - np.count_nonzero(CurrentTime) 
print "Number of Runs=%f" %(numberRuns) 
#Compute the average 
averageState=stateOfTimeIntervals/numberRuns 
#Write to file and plot with gnuplot 
np.savetxt('plot2gnu.txt',averageState) 

Затем с помощью GNUPLOT I «plot2gnu.txt нанесено», используя следующий код

# to plot everything on the same plot use "multiplot" 
set multiplot layout 2,1 title "Insert title" font ",14" 
set tmargin 3 
set bmargin 3 
set lmargin 5 
set rmargin 2 
plot "data.txt" every :1 using 1:2:(column(-2)) with linespoints lc variable 
plot 'plot2gnu.txt' using 1:2 with linespoints 

Я хотел бы отметить использование псевдостолбец колонки»(-2) 'в третьем столбце, определяющем цвет линии. «column (-2)» представляет «Индексный номер текущего набора данных в файле, который содержит несколько наборов данных». - Из «старой» документации gnuplot 4.6.