Sorting 如何在gnuplot中对数据块进行排序?

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

对于按列对文件进行排序,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 > ".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的解决方案。因此,无可否认,除了平台独立性之外,我没有一个好的理由让Windows
    z排序
    的工作方式与Linux的排序方式相同。
      tempfile = system("mktemp")
      set print "| sort -k 1,2 > ".tempfile
      print $Data
      unset print
      plot tempfile with points