大型分组数据绘图

时间:2012-05-01 13:09:43

标签: plot gnuplot

我有大量的数据要绘制,我正在尝试使用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实现吗?如果是这样,如果有人发布我应该使用的一组命令,我将不胜感激。

2 个答案:

答案 0 :(得分:2)

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

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

将绘制每100个数据点。

我不确定是否可以在gnuplot中优雅地执行您想要的操作(绘制垂直线条),但这是我的解决方案(假设是UNIX-y环境)。首先制作一个名为sort.awk的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样式的输出。您还可以尝试在awnlot脚本中嵌入awk脚本。

答案 1 :(得分:1)

你可以做类似的事情......(在unix上最简单)。你需要每三行插一个空格 - 我没有看到任何方法。如果您使用的是unix,那么命令

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

应该这样做。 (见How do I insert a blank line every n lines using awk?

当然,您可以(并且可能应该)将其直接打包到您的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