gnuplot中由正则表达式过滤的选定列的总和
我知道gnuplot不是一个数据处理系统,而是一个绘图软件。但无论如何 在python中,我可以通过传递一个参数来选择多个列,例如df.filter regex='\.x$'将返回名为'sw0.x','sw1.x'等的列。然后我可以将它们相加并绘制它们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
最近我转到了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