これが私が思いついたテストデータファイルです:
たとえば .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)
または) を使用できます。$0
0 番目のレコードはタイトルを保持し、最初のレコードは最初のブロックを保持します。最初のレコードに対して 0 を返す関数が必要なので、 を使用しますcolumn(0)-1
。すべてをまとめると、x 位置は次のようになります。
(column(0)-1-0.5+BOXSIZE*(COL-STARTCOL+1+GAPSIZE/2))
これは私が上に持っているものと同等です。