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