2016-04-13 13 views
1

私は二重時系列の最小値と最大値にラベルを付けるプロットを作成しています。なぜgnuplotのラベルの最小値/最大値が正しくないのですか?

minmax関数を定義し、各時点でより高い値と低い値のラベルと共に各系列をプロットすることでこれを行います。ラベルは上下にオフセットされているので、線と重複しません。

broken plot

ラベルに関係なく、第一又は第二の列の値が高いかどうかを、常に第二列の値であることに留意されたいです。

主な問題は、最小/最大の機能が点をプロットするように機能するが、ラベルを選択するのではないと思われる。

なぜこの場合ですか?ここで

は私のMWEです:

set terminal pdfcairo size 3,2 
set output 'output.pdf' 

# min/max functions 
min(x, y) = x > y ? y : x 
max(x, y) = x > y ? x : y 

set style data lines 

# nice ranges 
set xr [-1:5] 
set yr [-1:3] 

plot 'data.dat' u 0:1 title 'col 1', \ 
    '' u 0:2 title 'col 2', \ 
    '' u 0:(min($1,$2)) title 'min', \ 
    '' u 0:(max($1,$2)) title 'max', \ 
    '' u 0:(min($1,$2) - 0.2):(min($1,$2)) notitle with labels, \ 
    '' u 0:(max($1,$2) + 0.2):(max($1,$2)) notitle with labels 

とデータファイル:

1 2 
2 0 
1 2 
1 0 
0 1 
+2

ラベルをフォーマットするために 'sprintf'を明示的に使う必要があると思います:' plot 'data.dat' u 0:(min($ 1、$ 2) - 0.2):(sprintf( '%.0f'、min($ 1 、$ 2)))notitle with label'と書かれています。 – Christoph

+0

あなたのコメントを回答すると私はそれを受け入れます。それはうまくいった!私はそれが文字列/数値比較と関係していると思っていました。そして、 'int'とのキャストによる私の実験はうまくいかなかったのです。 – andyras

+1

私は確信が持てませんでしたが、今は古いバグレポートへのリンクも見つかりました。 – Christoph

答えて

2

あなたが明示的にラベルをフォーマットするsprintfを使用する必要がありますいくつかの特殊なケースについては

plot 'data.dat' u 0:(min($1,$2) - 0.2):(sprintf('%.0f', min($1,$2))) notitle with label 

変換文字列への変換は自動的に行われますが、動作することは保証されません。 sprintfでのみ安全です。この動作についての詳細は、 https://sourceforge.net/p/gnuplot/bugs/1368/も参照してください。

関連する問題