gnuplot中由正则表达式过滤的选定列的总和

gnuplot中由正则表达式过滤的选定列的总和,gnuplot,Gnuplot,我知道gnuplot不是一个数据处理系统,而是一个绘图软件。但无论如何 在python中,我可以通过传递一个参数来选择多个列,例如df.filter regex='\.x$'将返回名为'sw0.x','sw1.x'等的列。然后我可以将它们相加并绘制它们 最近我转到了pgfplots latex,我在大型数据集上广泛使用gnuplot和pgfplots。很多时候,我需要绘制与给定正则表达式匹配的许多列的总和。我想每100行打印'data.csv'SUM\.x$,其中function/macro/w

我知道gnuplot不是一个数据处理系统,而是一个绘图软件。但无论如何

在python中,我可以通过传递一个参数来选择多个列,例如df.filter regex='\.x$'将返回名为'sw0.x','sw1.x'等的列。然后我可以将它们相加并绘制它们


最近我转到了pgfplots latex,我在大型数据集上广泛使用gnuplot和pgfplots。很多时候,我需要绘制与给定正则表达式匹配的许多列的总和。我想每100行打印'data.csv'SUM\.x$,其中function/macro/which SUM接受正则表达式并返回相应列的总和

在这种情况下,很可能需要将该加工部件外包给熊猫。例如,如果创建脚本filter.py,例如:

然后您可以在Gnuplot中将其重用为:

plot "<python filter.py data.csv" w lp

gnuplot不支持正则表达式,但在某些情况下,您可以通过定义合适的函数来获得类似的功能。 @迪拉瓦,你没有提供太多关于你数据的细节。我假设分隔符是空白。 正如@ewcz所写的,您可以始终使用外部工具将数据预处理为gnuplot可以绘制的格式。 然而,如果可能的话,如果它没有变得太复杂,为什么不使用gnuplot本身呢

在您的例子中,如果columnheader的结尾与某个字符串匹配,您将询问如何对列进行求和。您可以简单地使用strstrt来实现这一点。检查帮助strstrt和下面的示例,它们肯定可以进一步优化

代码:

结果:


出于某种我还不明白的原因,我无法使用更简单的命令columnheadx来代替繁琐的myHeadersi创建。
plot "<python filter.py data.csv" w lp
### select columns by matching end of columnheader
reset session

$Data <<EOD
ID sw0.x sw0.y sw0.z sw1.x sw1.y sw1.z
1    0.1   2.1   6.1   0.5   2.5   6.5
2    0.2   2.2   6.2   0.6   2.6   6.6
3    0.3   2.3   6.3   0.7   2.7   6.7
4    0.4   2.4   6.4   0.8   2.8   6.8
5    0.5   2.5   6.5   0.9   2.9   6.9
EOD

stats $Data u 0 nooutput  # get maximum number of columns
colMax = STATS_columns 

# get headers into a string
set table $Dummy
    myHeaders = ''
    plot for [i=1:colMax] $Data u \
        (myHeaders = myHeaders.' '.strcol(i),'') every ::0::0 w table
unset table
myHeader(i) = word(myHeaders,i)      # get the ith item of the header line

# match end of string 1=match, 0=no match
MatchEnd(s,m) = s[strlen(s)-strlen(m)+1:strlen(s)] eq m ? 1 : 0
# sum up the columns which match
SumUp(m) = sum [col=1:colMax] ( MatchEnd(myHeader(col),m) ? column(col) : 0 )

set key top left
plot for [i=2:colMax] $Data u 1:i w lp pt 6 ti columnhead, \
     $Data u 1:(SumUp(".x")) skip 1 w lp pt 7 ps 2 lc "red"   title "Sum up '.x'", \
     $Data u 1:(SumUp(".y")) skip 1 w lp pt 7 ps 2 lc "green" title "Sum up '.z'", \
     $Data u 1:(SumUp(".z")) skip 1 w lp pt 7 ps 2 lc "blue"  title "Sum up '.z'"
### end of code