2

現在、スクリプトを使用してヒストグラム プロットを生成しています。たとえば、次のように実行しています。

set style histogram cluster gap 4
plot for [COL=2:10] 'example.dat' u COL:xticlabels(1) title columnheader(COL)

ここで、ヒストグラムのバーの上に y 値 (数値) を追加したいのですが、追加するとw labels「このスタイルには十分な列がありません」というエラーが発生します。

plot for [COL=2:10] 'example.dat' u COL:xticlabels(1) title columnheader(COL), \
    for [COL=2:10] 'example.dat' u COL title '' w labels

ヒストグラム スタイルを使用して y ラベルを追加することは可能ですか?

注: プロットの例があることは知っていwith boxesます。可能であれば、ヒストグラム スタイルでこれを機能させたいと考えています。

4

1 に答える 1

9

これが私が思いついたテストデータファイルです:

たとえば .dat

 hi world foo bar baz qux
 1   2     3   4   5   6    
 4   5     7   3   6   5    

これをプロットするために使用したスクリプトは次のとおりです。

set yrange [0:*]
GAPSIZE=4
set style histogram cluster gap 4
STARTCOL=2                 #Start plotting data in this column (2 for your example)
ENDCOL=6                   #Last column of data to plot (10 for your example)
NCOL=ENDCOL-STARTCOL+1     #Number of columns we're plotting 
BOXWIDTH=1./(GAPSIZE+NCOL) #Width of each box.
plot for [COL=STARTCOL:ENDCOL] 'example.dat' u COL:xtic(1) w histogram title columnheader(COL), \
    for [COL=STARTCOL:ENDCOL] 'example.dat' u (column(0)-1+BOXWIDTH*(COL-STARTCOL+GAPSIZE/2+1)-0.5):COL:COL notitle w labels

ヒストグラムの各クラスターは、x 軸で合計 1 単位の幅を取ります。必要な幅の数はわかっています (ギャップサイズであるため、ボックスの数 +4)。各ボックスの幅を計算できます ( 1/(N+4))。次に、通常どおりヒストグラムをプロットします。with histogram(プロットコマンドに追加したことに注意してください)。

組み込みのヘルプによると、ラベルには 3 列のデータが必要です ( x y label)。この場合、y 位置とラベルは同じで、列から直接読み取ることができますCOL。最初のブロックの x 位置の中心は 0 です (合計幅は 1 です)。したがって、最初のブロックは に配置されx=-0.5+2*BOXWIDTHます。ここでの 2 は、ギャップが 4 ボックス幅 (左側に 2 つ、右側に 2 つ) であるためです。次のブロックは-0.5+3*BOXWIDTHなどに配置されます。一般に、( の関数としてCOL)これは次のように記述できます。

-0.5+BOXSIZE*(COL-STARTCOL+1+GAPSIZE/2)

読み取る追加ブロックごとに、これを 1 単位右にシフトする必要があります。各ブロックはデータ ファイルの 1 行に対応するため、gnuplot が読み取る "レコード/行" ごとにインクリメントされるため、疑似列0(column(0)または) を使用できます。$00 番目のレコードはタイトルを保持し、最初のレコードは最初のブロックを保持します。最初のレコードに対して 0 を返す関数が必要なので、 を使用しますcolumn(0)-1。すべてをまとめると、x 位置は次のようになります。

(column(0)-1-0.5+BOXSIZE*(COL-STARTCOL+1+GAPSIZE/2))

これは私が上に持っているものと同等です。

于 2012-10-17T13:12:18.587 に答える