Sorting 如何在gnuplot中对数据块进行排序?
对于按列对文件进行排序,Linux用户可以使用实用程序Sorting 如何在gnuplot中对数据块进行排序?,sorting,gnuplot,Sorting,Gnuplot,对于按列对文件进行排序,Linux用户可以使用实用程序sort。 Windows用户必须从安装,例如CoreUtils,才能获得相同(或类似)的功能 因此,先按列1、再按列2对文件进行排序,然后打印文件的最小代码如下: plot '<sort -k 1,2 "myFile.dat"' u 1:2 tempfile = system("mktemp") set print "| sort -k 1,2 > ".tem
sort
。
Windows用户必须从安装,例如CoreUtils
,才能获得相同(或类似)的功能
因此,先按列1、再按列2对文件进行排序,然后打印文件的最小代码如下:
plot '<sort -k 1,2 "myFile.dat"' u 1:2
tempfile = system("mktemp")
set print "| sort -k 1,2 > ".tempfile
print $Data
unset print
plot tempfile with points
到目前为止,我尝试的命令都以错误消息结束:
plot '<sort -k 1,2' $Data u 1:2
#--> Bad data on line 1 of file <sort -k 1,2
plot '<sort -k 1,2 $Data' u 1:2
plot '<sort -k 1,2 <$Data' u 1:2
#--> warning: Skipping data file with no valid points
#--> x range is invalid
plot '<sort -k 1,2 '<$Data u 1:2
#--> Column number or datablock line expected
知道为什么吗?我正在Win10上运行gnuplot 5.4.1。将$Data发送到排序实用程序的stdin的语法是
set print“| sort”;打印$Data
。但这不能满足你的要求。相反,让我们在gnuplot中执行双重排序
$Data <<EOD
1 6
4 8
3 7
2 5
1 4
2 3
EOD
set table $Data_1
plot $Data using 1:2:2 smooth zsort with points
set table $Data_2
plot $Data_1 using 1:2:1 smooth zsort with points
unset table
print $Data_2
# Curve 0 of 1, 6 points
# Curve title: "$Data_1 using 1:2:1"
# x y type
1 4 i
1 6 i
2 3 i
2 5 i
3 7 i
4 8 i
$Data如果没有解决方法,就不会是gnuplot。嗯,有点麻烦,但它似乎有效。
显然,smooth zsort
分别对每个子块进行排序。因此,在第一次排序之后,只要第一列中的值发生变化,您就“简单地”需要将数据拆分为子块
按第一列排序
在第一列中的值更改之前插入空行
按第二列排序
将其打印到表格中以再次删除空行
代码:(编辑:使用图形表示法,更容易说明zsort的不良行为(仅在Windows下))
排序数据块,“bug”:Windows zsort不保留顺序
重置会话
#创建一些随机测试数据
设置打印$Data
为[i=1:100]做的事{
打印sprintf(“%g%g”、整数(兰特(0)*10)、整数(兰特(0)*10))
}
套印
#不保留订单(仅在Windows下)
设置表$Data1
绘图$Data u 1:2:2平滑Z排序
设置表$Data2
绘图$Data1 u 1:2:1平滑Z排序
未设置的表
#订单保留(即使在Windows下,但繁琐)
设置表$Data3
绘图$Data u 1:2:1平滑Z排序
未设置的表
设置打印$Data4
[i=1:|$Data3 |]的do{
打印$Data3[i]
如果(i我将备份并建议您重新考虑您最初对使用临时文件的限制。最简单的解决方案是:
set print "| sort -k 1,2 > sorted.dat"
print $Data
unset print
plot 'sorted.dat'
如果您解释了为什么不想使用临时文件,那么这个问题的答案可能与排序问题无关。
如果问题是临时文件的名称,那么可能是这样的:
plot '<sort -k 1,2 "myFile.dat"' u 1:2
tempfile = system("mktemp")
set print "| sort -k 1,2 > ".tempfile
print $Data
unset print
plot tempfile with points
谢谢你的建议。这是自gnuplot 5.4.0以来的一个新功能。但是,当我复制和粘贴你的代码时,我得到了一个不同的结果。我不知道为什么。我将编辑我的问题。gnuplot使用qsort()。在linux glibc中,qsort作为一个合并排序来实现,保留先前的“相等”元素顺序(我认为API不能保证这一点,但目前在实践中是正确的)。这使得多程排序成为可能。我不知道qsort是如何在Windows上实现的。Gnuplot的平滑zsort
可以修改为保证子排序顺序z/x/y(或z/y/x?)在执行时间上花费很少。如果你想支持这一点,请在开发邮件列表上提出这个问题。谢谢你的解释。嗯,Windows再次:-保留顺序真的很好。我可以提交一个“bug”报告Sourceforge上的bugtracker,还是更喜欢开发邮件列表?有什么区别?是“受众”?提交错误报告:是否最终有机会包含字母数字排序?好吧,写入临时文件肯定有效。我希望不会出现文件打开、写入、关闭和重新读取时间问题。如果我(快速)RAM中有数据,为什么要将其写入(慢速)仅用于排序的HDD?如果只排序一次,则较长的时间可能不是问题。如果必须一次又一次排序,这将用于数据处理和分析,而gnuplot不希望成为此类任务的工具。我的简单希望是zsort
(虽然不是用于这样的排序)仍然可以工作。但是,现在zsort
的Windows实现阻碍了这一计划。我知道我总是可以使用Python或其他编程语言为gnuplot准备数据,尽管我更喜欢只使用gnuplot的解决方案。因此,无可否认,除了平台独立性之外,我没有一个好的理由让Windowsz排序
的工作方式与Linux的排序方式相同。
tempfile = system("mktemp")
set print "| sort -k 1,2 > ".tempfile
print $Data
unset print
plot tempfile with points