0

我有大量数据要绘制,我正在尝试使用 gnuplot。数据是大约 80000 个元素的排序数组。通过简单地使用

plot "myData.txt" using 1:2 with linespoints linetype 1 pointtype 1

我得到了输出,但是:渲染需要时间,而且点通常很混乱,偶尔会有间隙。为了解决第二个问题,我想到了做条形图:每个条目都对应一个条形图。但是,我不确定如何实现这一点。我想在连续的条之间有一些空间,但我不希望它是可见的。您对绘制数据有何建议?

………………………………………………………………………………

由于数据量大,我想最好分组。请注意,我的数据看起来像

1 11041.9
2 11041.9
3 9521.07
4 9521.07
5 9520.07
6 9519.07
7 9018.07
...

我想按一组 3 绘制数据,即第一条垂直线应该从 9521.07 开始,作为 1、2、3 和结束于 11041 的点的最小值。第二条垂直线应该考虑以下内容3 点:4、5 和 6,从 9519.07 开始,在 9521.07 结束,以此类推。

考虑到如图所示的数据文件,这可以通过 gnuplot 实现吗?如果是这样,如果有人发布一组我应该使用的命令,我将不胜感激。

4

2 回答 2

2

要减少 gnuplot 实际绘制的点数,可以使用every关键字,例如

plot "myData.txt" using 1:2 with linespoints linetype 1 pointtype 1 every 100

将绘制每 100 个数据点。

我不确定是否可以在 gnuplot 中优雅地做你想做的事情(绘制垂直线),但这是我的解决方案(假设是 UNIX-y 环境)。首先制作一个名为的 awk 脚本sort.awk

BEGIN { RS = "" }
{
 # the next two lines handle the case where
 # there are not three lines in a record
 xval = $1 + 1
 ymin = ymax = $2
 # find y minimum
 if ($2 <= $4 && $2 <= $6)
  ymin=$2
 else if ($4 <= $2 && $4 <= $6 && $4 != "")
  ymin=$4
 else if ($6 <= $2 && $6 <= $4 && $6 != "")
  ymin=$6
 # find y maximum
 if ($2 >= $4 && $2 >= $6)
  ymax=$2
 else if ($4 >= $2 && $4 >= $6)
  ymax=$4
 else if ($6 >= $2 && $6 >= $4)
  ymax=$6
 # print the formatted line
 print ($1+1) " " ymin " " ymin " " ymax " " ymax
}

现在这个 gnuplot 脚本将调用它:

set terminal postscript enhanced color
set output 'plot.eps'

set boxwidth 3
set style fill solid
plot "<sed 'n;n;G;' myData.txt | awk -f sort.awk" with candlesticks title 'pretty data'

它不漂亮,但它有效。 sed每 3 行添加一个空白行,并awk格式化样式的输出candlesticks。您也可以尝试将 awk 脚本嵌入到 gnuplot 脚本中。

于 2012-05-01T23:56:14.073 回答
1

你可以做这样的事情......(在unix上最简单)。您需要每三行插入一个空格——我看不出有什么办法。如果你在 unix 上,命令

awk 'NR % 3 == 0 {print ""} 1' myfile

应该这样做。(请参阅如何使用 awk 每 n 行插入一个空行?

当然,您可以(并且可能应该)将其直接打包到您的 gnuplot 文件中。

所以,总而言之,你会有这样的事情:

xval(x)=int(x)/3  #Return the x position on the plot
plot "< awk 'NR % 3 == 0 {print ""} 1' datafile" using (xval($1)):2 with lines
于 2012-05-02T13:20:49.047 回答