2

これは、私が使用しているコードの最小限の実例です:

#!/bin/bash
gnuplot << EOF

set term postscript portrait color enhanced 
set encoding iso_8859_1
set output 'temp.ps'
set grid noxtics noytics noztics front
set size ratio 1
set multiplot
set lmargin 9; set bmargin 3; set rmargin 2; set tmargin 1

n=32    #number of intervals
max=13. #max value
min=-3.0    #min value
width=(max-min)/n        #interval width
hist(x,width)=width*floor(x/width)+width/2.0

set boxwidth width
set style fill solid 0.25 noborder

plot "< awk '{if (3.544068>=\$1) {print \$0}}' /data_file" u (hist(\$2,width)):(1.0) smooth freq w boxes lc rgb "red" lt 1 lw 1.5 notitle


EOF

これは私にこれを取得します:

ボックス

histeps代わりに使用する必要がありますが、上記のコマンドboxesで forを変更するhistepsと、次のようになります。plot

ヒステプス

ここで何が起こっているのですか??

これがdata_fileです。ありがとうございました!


編集:histeps間に値を補間するのではなく、実際の外側のバーの制限に従うことboxesができない場合 (そうするように) 、で作成されたヒストグラムの輪郭だけboxesをどのように描画できますか?


EDIT2:いつものように、あなたの答えは役に立ちません。マイナーな不具合が 1 つありますが、これは、両方のプロットをコマンドで結合したときに得られる出力です。

plot "< awk '{if (3.544068>=\$1) {print \$0}}' data_file" u (hist(\$2,width)):(1.0) smooth freq w boxes lc rgb "red" lt 1 lw 1.5 notitle, \
"<python pyscript.py data_file" u 1:2 w histeps lc rgb "red" lt 1 lw 1.5 notitle

histo_shifted

何かがスクリプトの出力をシフトしているように見えますが、pythonそれが何であるかわかりません。(コメントで修正)

4

1 に答える 1

2

Python + numpy があれば、ビニングは非常に簡単です。これは非常に人気のあるパッケージであるため、Linux を使用している場合は、ディストリビューションのリポジトリで見つけることができるはずです。

#Call this script as:
#python this_script_name.py 3.14159 data_file.dat

import numpy as np
import sys

n=32         #number of intervals
dmax=13.     #max value
dmin=-3.0    #min value


#primitive commandline parsing
limit = float(sys.argv[1])   #first argument is the limit
datafile = sys.argv[2]       #second argument is the datafile to read

data = []    #empty list
with open(datafile) as f:  #Open first commandline arguement for reading.
    for line in f:            #iterate through file returning 1 line at a time
        line = line.strip()   #remove whitespace at start/end of line
        if line.startswith('#'): #ignore comment lines.
            continue
        c1,c2 = [float(x) for x in line.split()] #convert line into 2 floats and unpack
        if limit >= c1:  #Check to make sure first one is bigger than your 3.544...
            data.append(c2) #If c1 is big enough, then c2 is part of the data

counts, edges = np.histogram(data,               #data to bin
                             bins=n,             #number of bins
                             range=(dmin,dmax),  #bin range
                             normed=False        #numpy2.0 -- use `density` instead
                             )
centers = (edges[1:] + edges[:-1])/2.  #average the bin edges to the center. 

for center,count in zip(centers,counts):  #iterate through centers and counts at same time
    print center,count                    #write 'em out for gnuplot to read.

gnuplot スクリプトは次のようになります。

set term postscript portrait color enhanced 
set output 'temp.ps'
set grid noxtics noytics noztics front
set size ratio 1
set multiplot
set lmargin 9 
set bmargin 3
set rmargin 2 
set tmargin 1

set style fill solid 0.25 noborder

plot "<python pyscript.py 3.445 data_file" u 1:2 w histeps lc rgb "red" lt 1 lw 1.5 notitle

もう少し暇なときに詳しく説明します...

于 2012-10-23T00:15:35.710 に答える