如何在 Gnuplot 中绘制两个图的特定行?

如何在 Gnuplot 中绘制两个图的特定行?

数据

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 行绘制一张图
  • 另一个从 7:11 开始

我的开始是基于此博客文章

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;

它只给你一张图表。

马可的输出

为了清楚起见,我将对数刻度放在 y 轴上,其中一些代码基于此回答

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;

给予

在此输入图像描述

答案1

不要使用命令replot,而是使用逗号,
由于在您的脚本中我没有看到明显的理由需要使用该replot命令,因此我建议直接使用逗号,来分隔要绘制的两条曲线:plot sin(x), cos(x)例如。

把它当作一个好习惯,但它更多的是,原则上是不同的(见下文)。
您可能会发现将\ 作为最后一个字符来分割单行很有趣(请注意,它要求后面没有空格或其他字符)。它使脚本更加干净。

# ...
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命令代替你再次绘制每条曲线已经存在于图形上(重新读取数据并再次执行所有以下操作)并且仅您绘制新曲线。

这是一个好习惯,因为明天再次使用你的脚本,你可以有一个通用的减速当文件很多、很大或位于远程文件系统时,您的工作流程;当您执行长时间操作来处理数据时;当有效绘制的点很多并且您正在通过连接工作时,您需要等待窗口的图形更新更多 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关键字,而无需创建子shell()并调用外部程序,例如sed.如果你不能预购他们与种类,您可以添加以下样式smooth unique来绘制数据集linespointsx坐标排序的条目。

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

sed另一个优点是可移植性。它甚至可以在没有安装的地方工作,甚至可以在 Windows 下工作。
您可以注意到电话号码这是因为它从 开始0

每个块中的第一个数据编号为“0”,文件中的第一个块也是如此。


gnuplot help replot输出:

不带参数的命令replot重复最后一个plotorsplot 命令。这对于查看具有不同set选项的绘图或为多个设备生成相同的绘图时非常有用。

命令后指定的参数replot将添加到最后一个 plotsplot命令 (带有隐含的“,”分隔符)在重复之前。

答案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)'

相关内容