如何通过管道向gnuplot传递数据并支持多次处理(含stats命令)
解决方案:将管道数据导入gnuplot内部数据集
核心问题是标准输入(管道)是流式数据源,只能被读取一次:stats命令读完输入流后,指针会移动到末尾,后续plot再读取时就没有有效数据了。而本地文件可以通过重新定位指针实现多次读取,因此用临时文件时正常,用管道就会报错。
gnuplot 5.0及以上版本支持内部临时数据集(以$开头的变量),可以将管道数据一次性导入其中,之后就能反复访问。修改你的脚本如下:
### bar chart with conditional color lhb = ARG1 myColor(col) = (_s=strcol(col), _s eq lhb ? 0xff3333 : 0x3333ff) set style fill solid 0.5 set key noautotitle # 将管道数据导入内部数据集$Data plot '<cat' using 1:2 into $Data nooutput # 用内部数据集做统计分析 stats $Data using 0:2 nooutput set label 1 at STATS_max_x, STATS_mean_y sprintf("mean=%.1f",STATS_mean_y) offset 0,0.7 right # 基于内部数据集绘图 plot $Data using 0:2:(myColor(1)):xtic(1) w boxes lc rgb var, \ STATS_mean_y w l lw 2 lc "web-green"
运行方式
直接通过管道传递数据即可正常执行:
cat otherfile.txt | awk ... | gnuplot --persist -c stack.gp 'C'
关键说明
<cat是gnuplot调用系统cat命令读取标准输入,将数据一次性存入内存中的$Data数据集$Data支持被stats、plot等命令多次访问,彻底解决流式输入只能读一次的限制- 该方案要求gnuplot版本≥5.0,目前绝大多数使用环境都满足此版本要求
内容的提问来源于stack exchange,提问作者Phil
相关产品推荐
相关产品推荐

