我要为分割算法绘制罗伯逊图和pd图。 它们看起来像这篇文章末尾的图片中的内容。 我基本上有一个C ++程序可以获得所有需要的参数,所以我只需写下一些将所有这些行拼凑在一起的脚本。
考虑PD图,这对应于斜率m[0],...,m[n-1]
,因此为y = m[0]*x,...,y = m[n-1]*x
x
绘制 [x0,x1]
。为实现这一目标,最快的方法是什么?我正在考虑扩展我的C ++代码以吐出一些可以由gnuplot执行的脚本文件,但我从未使用它,所以我不知道格式或我需要的是什么。
也许这真的很傻,或者我只是不知道我真正需要做什么。
答案 0 :(得分:0)
假设您的斜率数据位于每行中有一个值的文件中,您可以将其转换为一个字符串,然后将其用作数组。通过将EOL字符替换为空格,使用tr
实用程序转换数据。然后,在f(k,x)
范围内的函数[x1:x2]
中使用每个值。
这是数据文件:
$ cat rob.dat
20
10
5
2
-2
-5
-10
-20
它转换为:20 10 5 2 -2 -5 -10 -20
并存储在变量a
中。
使用png终端,您可以获得图片,但不能使用斜体符号:
set term pngcairo enh mono solid lw 1.5 font "Helvetica,14" size 600,800
set output "rob.png"
set nokey
set noborder
set noxtics
set noytics
x1=-0.1
x2=10.0
f(k,x)=(x>=x1 && x<=x2 ? k*x : 1/0)
a=system("tr '\\n' ' ' < rob.dat")
v(n)=word(a,n)
set style arrow 1 head size 0.2, 25 filled
set arrow from x1-1,0 to x2+1.,0 arrowstyle 1
set arrow from 0.,f(v(8),x2) to 0.,f(v(1),x2) arrowstyle 1
set arrow from 4.,100. to 7.,60. arrowstyle 1 front
set label "Selection interval\nfor {/:Italic q_{j+1} = k}" at 1.,120.
set label "{/:Italic U_a = r{/Symbol r}d}" at x2+0.1, f(v(1),x2)
set label "{/:Italic U_k}" at x2+0.1, f(v(2),x2)
set label "{/:Italic L_k}" at x2+0.1, f(v(3),x2)
set label "{/:Italic U_0}" at x2+0.1, f(v(4),x2)
set label "{/:Italic L_0}" at x2+0.1, f(v(5),x2)
set label "{/:Italic U_k}" at x2+0.1, f(v(6),x2)
set label "{/:Italic L_k}" at x2+0.1, f(v(7),x2)
set label "{/:Italic L_{-a} = -r{/Symbol r}d}" at x2+0.1, f(v(8),x2)
set label "{/Italic rw[j]}" at 0.3,f(v(1),x2)
set label "{/Italic k} < 0" at 2.,-130.
set style fill solid 0.3
plot [-2:12][] for [b in a] f(b,x) w l lw 2 lc rgb "black", "+" u 1:(f(v(2),$1)):(f(v(3),$1)) w filledcurves
使用postscript eps终端,您可以获得一个(替换两个第一行):
set term post eps enh mono solid lw 2 font "Helvetica,30" size 6 in,9 in
set output "rob.eps"