3

我有一个看起来像这样的数据库文件:

aaa bb ccc 2 3.34534 kkk 3 4.5099 34%
rr wie fff 4 4.59050 asd 6 5.0983 1.345%

我需要从第 5 列的“y”值(即 3.34534)到第 8 列的值绘制一个范围。或者可以说,第一行的线宽为 4.5099-3.34534 的 ay=3.34534 线。或者,第一行 y=3.34534 和 y=4.5099 之间的某种填充曲线。这必须对第 5 列和第 8 列值之间的填充曲线的所有行进行。问题是,如何访问这些值并将它们输入 gnuplot。一个shell脚本可能吗?(到目前为止,我已设法将值保存到数组 x() 和 y():对于第 5 列中的值,由 ${x[0]} 访问的第一行和第 8 列中的值到 ${y[0] },现在的问题是如何通过 EOF>> 将数组中的值输入到 gnuplot 语法中。任何帮助表示赞赏。

4

2 回答 2

2

如果您想在 bash 脚本中将所有内容放在一起,您可以首先定义一个变量,其中包含所有 gnuplot 代码(参见例如BASH:保持格式设置但替换变量):

read -r -d '' GNUPLOT_SCRIPT <<EOF
set xrange [0:1];
plot x
EOF

请注意,使用该构造,gnuplot 代码的每一行都必须以;.

对于绘图,我将使用boxxyerrorbars绘图样式,它在具有给定宽度和高度的点处绘制框。在 gnuplotusing语句中,第一个和第二个值是box centerx的和值,第三个和第四个值给出半个盒子的宽度和高度。y

你没有说任何关于x-values 的事情,所以我选择了xrange0to 1

假设您的“数据库”在一个字符串中,bash 脚本如下所示:

#!/bin/bash

database="aaa bb ccc 2 3.34534 kkk 3 4.5099 34%
rr wie fff 4 4.59050 asd 6 5.0983 1.345%"

read -r -d '' GNUPLOT_SCRIPT <<EOF
set xrange[0:1];
set style fill solid 1.0;
set style data boxxyerrorbars;
unset key;
plot '-' using (0.5):(0.5*(column(5)+column(8))):(0.5):(abs(0.5*(column(5) - column(8))))
EOF

echo "$database" | gnuplot -persist -e "$GNUPLOT_SCRIPT"

如果要将绘图保存在文件中,则不需要该-persist选项。

于 2013-11-12T14:13:58.780 回答
0

为了回答自己问题的另一部分,我想出了如何从 file.dat 中执行此操作 假设数据库不在字符串中,而是在 file.dat 中,结果以 .png 图像的形式出现。

gnuplot << EOF
set terminal png
set output "niceplot.png"
plot "file.dat" using (0.5):(0.5*(column(5)+column(9))):(0.5):(abs(0.5*(column(5) - column(9)))) with boxxy fs solid 1 noborder lc rgb "red" title "Range"
EOF

其中, fs solid 1 noborder lc rgb "red" title "Range" 是 gnuplot 的一些样式。感谢 Christoph 建议错误框。

于 2013-11-12T18:25:35.277 回答