web-dev-qa-db-ja.com

Gnuplotで2つのグラフの特定の行をプロットする方法は?

データ

ID      BlockSize Size      Blocks
-       511.991   241520288  471728
001     511.868   24152000   47184
0001    503.2     241520     480
00001   510.829   2415200    4728
000001  511.360   4782240    9352
0000001 486.935   120760     248
000     511.889   24103840   47088
0000    493.265   193360     392
00000   511.019   2367040    4632
000000  511.262   4830400    9448
0000000 483.4     96680      200

欲しいところ

  • プロットに使用される列3:4
  • 行2:6から1つのグラフをプロットします
  • 別の7:11から

これに基づいた私のスタート blogpost

set terminal qt; 
plot "<(sed -n '2,6p' sandboxgp.data)" using 3:4 with lines; 
plot "<(sed -n '7,11p' sandboxgp.data)" using 3:4 with lines;

グラフは1つだけです。

マルコの出力

ここでは、コードがこれに基づいていることを明確にするために、ログスケールをy軸に配置しました answer

set terminal qt; 
plot "<(sed -n '2,6p' sandbox_gp_pure.data)" using 3:4 with linespoints; 
replot "<(sed -n '7,11p' sandbox_gp_pure.data)" using 3:4 with linespoints; 
set logscale y 10; 
set xlabel "Size"; set ylabel "log(Blocks)"; 
set grid xtics ytics mxtics mytics lc rgb 'blue' lt 1, lc rgb 'red' lt 1; set mxtics; set mytics 5; 
set out;

与える

enter image description here

replotコマンドを使用せず、代わりにカンマを使用してください_,_
スクリプトにreplotコマンドを使用する必要がある明確な理由がないため、プロットする2つの曲線を区切るためにカンマ_,_を直接使用することをお勧めします。plot sin(x), cos(x)たとえば。

良い習慣としてとらえますが、それ以上に、原則的に異なります(以下を参照)。
1行を分割する最後の文字として_\_を入力すると面白い場合があります(後に空白や他の文字がないことが必要です)。スクリプトがよりクリーンになります。

_# ...
set style data linespoint   # To avoid to repeat it on each line of plot command
                            # Note below no spaces after the `\` 
plot "<(sed -n '2,6p'  sandbox_gp_pure.data)"  using 3:4  \
   , "<(sed -n '7,11p' sandbox_gp_pure.data)"  using 3:4 
_

代わりにreplotコマンドを使用して各曲線を再度プロットしますグラフィックにすでに存在し(データを再読み込みし、以下のすべての操作を再度実行します)、afterあなたのみ新しい曲線をプロットします。

これは良い習慣です。明日もスクリプトを使用すると、ファイルが多い、大きい、または大きい場合に、作業プロセスの一般的な速度を落とすことができます。リモートファイルシステム上。データを処理するために長い操作を実行する場合。効果的にプロットされたポイントが多く、_ssh -X_接続を介して作業している場合は、ウィンドウのグラフィカルな更新をさらに待つ必要がある場合。

さらに、ターミナルではpdfcairoとして

_set terminal pdfcairo;  set output 'my.pdf' ;
  plot    sin(x) 
  replot  cos(x)
set output  ; set terminal qt # or whatever is your default terminal
_

2ページのドキュメントとより大きなPDFファイルを取得します。


注:サブシェル_()_を作成したり、everyなどの外部プログラムを呼び出したりしなくても、sedキーワードを使用できます。 sort でそれらを事前注文できない場合は、_smooth unique_を追加して、linespointsでデータセットをプロットできます。 lovesエントリをx座標で並べ替えたスタイル。

_plot "sandbox_gp_pure.data" every ::1::5   us 3:4 t "set 1" w linesp \
   , ''                     every ::6::10  us 3:4 t "set 2" w linesp
_

または注文したい場合

_plot "sandbox_gp_pure.data" every ::1::5  u 3:4 smooth unique t "set 1" w linesp\
   , ''                     every ::6::10 u 3:4 smooth unique t "set 2" w linesp
_

もう1つの利点は移植性です。 sedがインストールされていない場合でも機能し、Windowsでも機能するはずです。
行番号のシフトは、_0_から始まるためです。

各ブロックの最初のデータは、ファイルの最初のブロックと同様に「0」の番号が付けられます。


gnuplot_help replot_出力:

引数のないreplotコマンドは、最後のplotまたはsplotコマンドを繰り返します。これは、異なるsetオプションを使用してプロットを表示する場合、または複数のデバイスに対して同じプロットを生成する場合に役立ちます。

replotコマンドの後に指定された引数は最後のplotまたはsplotコマンドに追加されます(暗黙の '、'区切り文字付き)繰り返された。

2
Hastur

2番目のグラフのreplotの代わりにplotを使用します。その後、最初のグラフは上書きされません。

# will plot one graph
gnuplot -p -e 'plot sin(x); plot cos(x)'

# will plot two graphs
gnuplot -p -e 'plot sin(x); replot cos(x)'
2
Marco