Nis*_*ter 6 performance plot file gnuplot
我试图用一个大文本文件制作一个"动画"图,其中包含以下脚本的大量数据(1000个粒子的位置):
set terminal wxt size 1000,600
k=999999
N = 999
do for [i=0:k]{
plot for [j=0:N-1] "pos.txt" using 2*j+1:2*j+2 every ::2*i+1::2*i+1 ls 1 pt 7 ps 2 notitle
Run Code Online (Sandbox Code Playgroud)
在文件中,每一行在我想要绘制的点的特定时间都有坐标X和Y. 我every用来绘制每行中的所有数据,然后继续下一行.
输出是这样的(1000颗粒移动)
然而,绘图太慢了,我不知道我能做些什么来让它更快地绘制.它每5秒或更长时间绘一行一次.该文件加权一些MB.我应该更换终端吗?还是我存储数据的方式?我认为当gnuplot加载一个大文件时可能会出现问题.
一些粒子在模拟中消失,因此line 14: warning: Skipping data file with no valid points当索引j(井2j + 1)超过粒子数量时我也会得到错误,但我尝试制作它以便每次读取粒子数量甚至更慢.非常感谢.
我怀疑每次绘图时 gnuplot 都会读取整个文件,与读取有问题的行相反,然后是下一行,然后是下一行,等等。一种可能的策略是将粒子轨迹分成不同的文件,但特别是它可以plot for只需简单地plot加上一个块选择即可帮助删除every,其中您无需选择粒子的列,而是在同一块中具有同一时间步长的粒子位置。
现在你的数据看起来像这样:
x1 y1 x2 y2 x3 y3 # Time step 1
x1 y1 x2 y2 x3 y3 # Time step 2
Run Code Online (Sandbox Code Playgroud)
gnuplot 需要为每个时间步和粒子读取一次文件。如果按如下方式构建文件(请注意块之间有一个空行):
# Time step 1
x1 y1
x2 y2
x3 y3
# Time step 2
x1 y1
x2 y2
x3 y3
Run Code Online (Sandbox Code Playgroud)
那么你不需要plot for,而是只需在 中插入一个额外的分号来选择包含所有粒子的相应块every:
set terminal wxt size 1000,600
k=999999
#N = 999 you don't need this anymore!
do for [i=0:k] {
plot "pos.txt" every :::i::i
}
Run Code Online (Sandbox Code Playgroud)
上面的代码读取每个时间步的文件,而不是每个时间步和粒子,并一次绘制所有粒子。