1

こんにちは、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でそれを実装しようとして立ち往生しています。どんな支援も素晴らしいでしょう!

4

1 に答える 1

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

次に、pythonを使用して、平均を確認したい間隔でデータの平均を見つけました。個別の時間ステップでチェックすることを選択しましたが、時間ステップは任意である可能性があります。以下は私のpythonコードです

#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 を使用して、次のコードを使用して「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

線の色を指定する 3 番目の列で疑似列 'column(-2)' を使用していることを指摘したいと思います。'column(-2)' は、「複数のデータ セットを含むファイル内の現在のデータ セットのインデックス番号」を表します。- 「古い」gnuplot 4.6 ドキュメントから。

于 2015-03-11T09:10:51.607 に答える