gnuplot 图的数据格式
Data format for gnuplot plot
我有来自 Fortran 代码的数据文件。数据是 2 个大小为 500 的数组 v 和 np 以及一个标量时间。
每次我将新的时间值和文件的 2 行中的 2 个向量附加到文件时,格式如下:
time, v(1), v(2), v(3), ..., v(499), v(500)
time, np(1), np(2), np(3), ..., np(499), np(500)
例如:
0.0, 1.0, 2.0, 3.0, ..., 499.0, 500.0
0.0, 0.1, 0.2, 0.3, ..., 0.499, 0.500
1.0, 1.0, 2.0, 3.0, ..., 499.0, 500.0
1.0, 0.1, 0.2, 0.3, ..., 0.499, 0.500
2.0, 1.0, 2.0, 3.0, ..., 499.0, 500.0
2.0, 0.1, 0.2, 0.3, ..., 0.499, 0.500
我想要的是在特定时间绘制 np
作为 v
的函数(所以在这种情况下,如果我想要 time=2
我将绘制第 5 和第 6 行忽略第一行)。但是 gnuplot 不喜欢这种格式。我使用 python 使其工作,但我必须使用 gnuplot 来完成它。
我在网上搜索,发现我可以用另一种格式输出我的数据,但这也不能正常工作。此格式如下所示:
0.0 0.0
1.0 0.1
2.0 0.2
3.0 0.3
4.0 0.4
... ...
499.0 0.499
500.0 0.500
1.0 1.0
1.0 0.1
2.0 0.2
3.0 0.3
4.0 0.4
... ...
499.0 0.499
500.0 0.500
2.0 2.0
1.0 0.1
2.0 0.2
3.0 0.3
4.0 0.4
... ...
499.0 0.499
500.0 0.500
此格式绘制所有内容,包括时间,甚至使用 for
循环和 every
函数也不起作用。
我还搜索了是否可以在 Fortran 的列中格式化我的数据,但是我找不到任何解决方案。我遇到的问题是每次都会从内存中删除数组 v
和 np
。由于我无法解释的原因,我无法将 v
和 np
保存在矩阵中以备后用。
有没有一种方法可以在 fortran 上格式化我的数据以在 gnuplot 上读取它并且只能绘制一次?
或者有什么方法可以只使用 gnuplot 读取这种格式?
gnuplot 不喜欢行中的数据。
您可以使用外部工具转置数据,然后使用 gnuplot 将其简单地绘制为列。不幸的是,gnuplot 本身没有转置函数,尽管原则上您也可以使用 gnuplot () 进行转置,但对于大型数据集来说它的效率可能非常低。
实际上,这是一个笨拙的 gnuplot 解决方案,用于绘制两行的数据。
感兴趣的行的值使用虚拟 table 存储在数组中(因此需要 gnuplot >=5.2.0)。选项 every ::SkipCols
跳过前 SkipCols
列。在您的情况下 SkipCols=1
会跳过时间值。
也许有人可以进一步简化这种方法。
代码:
### plotting a row versus another row (requires gnuplot >=5.2.0)
reset session
$Data <<EOD
0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7
0.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7
1.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7
1.0 3.1 3.2 3.3 3.4 3.5 3.6 3.7
2.0 4.1 4.2 4.3 4.4 4.5 4.6 4.7
2.0 5.1 5.2 5.3 5.4 5.5 5.6 5.7
EOD
myXrow = 2 # counting starts from 0
myYrow = 3 #
SkipCols = 1 # skip number of columns from the beginning
stats $Data u 0 nooutput # get the number of columns
array X[STATS_columns-SkipCols] # define array size
array Y[STATS_columns-SkipCols] #
myX(row) = (==row ? X[-SkipCols+1]= : NaN)
myY(row) = (==row ? Y[-SkipCols+1]= : NaN)
# put the x,y rows into arrays
set table $Dummy
plot $Data matrix u (myX(myXrow),myY(myYrow)) every :myYrow-myXrow:SkipCols:myXrow::myXrow+myYrow w table
unset table
undef $Dummy
set key noautotitle
plot X u 2:(Y[]) w lp pt 7
### end of code
结果:
添加:(gnuplot 5.0 版本)
这是 gnuplot 5.0 的版本。尽管在 gnuplot 5.0 中引入了数据块,但您不能像在 gnuplot 5.2 中那样通过索引来处理它们。因此,此解决方法使用字符串来存储行,然后将其打印回数据块。
不是很优雅,可能效率不高,但它似乎有效。
除非字符串长度有限制,否则它也应该适用于您的 500 列。实际上,你有逗号作为分隔符,所以你有 set datafile separator comma
和后来的 set datafile separator whitespace
。代码可能仍然可以优化。
代码:(结果同上)
### plotting a row versus another row (working for gnuplot 5.0)
reset session
$Data <<EOD
0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7
0.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7
1.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7
1.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7
2.0, 4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7
2.0, 5.1, 5.2, 5.3, 5.4, 5.5, 5.6, 5.7
EOD
myXrow = 2 # counting starts from 0
myYrow = 3
set datafile separator comma
X = Y = ''
AddValue(S,row) = S.(==row ? sprintf(" %g",) : '')
set table $Dummy
plot $Data matrix u (X=AddValue(X,myXrow),Y=AddValue(Y,myYrow)) every :myYrow-myXrow:1:myXrow::myXrow+myYrow
unset table
undef $Dummy
set print $DataNew
do for [i=1:words(X)] { print sprintf("%s %s",word(X,i),word(Y,i)) }
set print
set datafile separator whitespace
set key noautotitle
plot $DataNew u 1:2 w lp pt 7
### end of code
我有来自 Fortran 代码的数据文件。数据是 2 个大小为 500 的数组 v 和 np 以及一个标量时间。 每次我将新的时间值和文件的 2 行中的 2 个向量附加到文件时,格式如下:
time, v(1), v(2), v(3), ..., v(499), v(500)
time, np(1), np(2), np(3), ..., np(499), np(500)
例如:
0.0, 1.0, 2.0, 3.0, ..., 499.0, 500.0
0.0, 0.1, 0.2, 0.3, ..., 0.499, 0.500
1.0, 1.0, 2.0, 3.0, ..., 499.0, 500.0
1.0, 0.1, 0.2, 0.3, ..., 0.499, 0.500
2.0, 1.0, 2.0, 3.0, ..., 499.0, 500.0
2.0, 0.1, 0.2, 0.3, ..., 0.499, 0.500
我想要的是在特定时间绘制 np
作为 v
的函数(所以在这种情况下,如果我想要 time=2
我将绘制第 5 和第 6 行忽略第一行)。但是 gnuplot 不喜欢这种格式。我使用 python 使其工作,但我必须使用 gnuplot 来完成它。
我在网上搜索,发现我可以用另一种格式输出我的数据,但这也不能正常工作。此格式如下所示:
0.0 0.0
1.0 0.1
2.0 0.2
3.0 0.3
4.0 0.4
... ...
499.0 0.499
500.0 0.500
1.0 1.0
1.0 0.1
2.0 0.2
3.0 0.3
4.0 0.4
... ...
499.0 0.499
500.0 0.500
2.0 2.0
1.0 0.1
2.0 0.2
3.0 0.3
4.0 0.4
... ...
499.0 0.499
500.0 0.500
此格式绘制所有内容,包括时间,甚至使用 for
循环和 every
函数也不起作用。
我还搜索了是否可以在 Fortran 的列中格式化我的数据,但是我找不到任何解决方案。我遇到的问题是每次都会从内存中删除数组 v
和 np
。由于我无法解释的原因,我无法将 v
和 np
保存在矩阵中以备后用。
有没有一种方法可以在 fortran 上格式化我的数据以在 gnuplot 上读取它并且只能绘制一次?
或者有什么方法可以只使用 gnuplot 读取这种格式?
gnuplot 不喜欢行中的数据。
您可以使用外部工具转置数据,然后使用 gnuplot 将其简单地绘制为列。不幸的是,gnuplot 本身没有转置函数,尽管原则上您也可以使用 gnuplot (
实际上,这是一个笨拙的 gnuplot 解决方案,用于绘制两行的数据。
感兴趣的行的值使用虚拟 table 存储在数组中(因此需要 gnuplot >=5.2.0)。选项 every ::SkipCols
跳过前 SkipCols
列。在您的情况下 SkipCols=1
会跳过时间值。
也许有人可以进一步简化这种方法。
代码:
### plotting a row versus another row (requires gnuplot >=5.2.0)
reset session
$Data <<EOD
0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7
0.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7
1.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7
1.0 3.1 3.2 3.3 3.4 3.5 3.6 3.7
2.0 4.1 4.2 4.3 4.4 4.5 4.6 4.7
2.0 5.1 5.2 5.3 5.4 5.5 5.6 5.7
EOD
myXrow = 2 # counting starts from 0
myYrow = 3 #
SkipCols = 1 # skip number of columns from the beginning
stats $Data u 0 nooutput # get the number of columns
array X[STATS_columns-SkipCols] # define array size
array Y[STATS_columns-SkipCols] #
myX(row) = (==row ? X[-SkipCols+1]= : NaN)
myY(row) = (==row ? Y[-SkipCols+1]= : NaN)
# put the x,y rows into arrays
set table $Dummy
plot $Data matrix u (myX(myXrow),myY(myYrow)) every :myYrow-myXrow:SkipCols:myXrow::myXrow+myYrow w table
unset table
undef $Dummy
set key noautotitle
plot X u 2:(Y[]) w lp pt 7
### end of code
结果:
添加:(gnuplot 5.0 版本)
这是 gnuplot 5.0 的版本。尽管在 gnuplot 5.0 中引入了数据块,但您不能像在 gnuplot 5.2 中那样通过索引来处理它们。因此,此解决方法使用字符串来存储行,然后将其打印回数据块。
不是很优雅,可能效率不高,但它似乎有效。
除非字符串长度有限制,否则它也应该适用于您的 500 列。实际上,你有逗号作为分隔符,所以你有 set datafile separator comma
和后来的 set datafile separator whitespace
。代码可能仍然可以优化。
代码:(结果同上)
### plotting a row versus another row (working for gnuplot 5.0)
reset session
$Data <<EOD
0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7
0.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7
1.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7
1.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7
2.0, 4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7
2.0, 5.1, 5.2, 5.3, 5.4, 5.5, 5.6, 5.7
EOD
myXrow = 2 # counting starts from 0
myYrow = 3
set datafile separator comma
X = Y = ''
AddValue(S,row) = S.(==row ? sprintf(" %g",) : '')
set table $Dummy
plot $Data matrix u (X=AddValue(X,myXrow),Y=AddValue(Y,myYrow)) every :myYrow-myXrow:1:myXrow::myXrow+myYrow
unset table
undef $Dummy
set print $DataNew
do for [i=1:words(X)] { print sprintf("%s %s",word(X,i),word(Y,i)) }
set print
set datafile separator whitespace
set key noautotitle
plot $DataNew u 1:2 w lp pt 7
### end of code