Gnuplot多数据集绘图颜色分配异常问题求助
问题诊断与解决
你的问题核心是第三个grep命令的正则表达式被shell错误解析,导致第三个数据集包含了所有行(包括weekdays的数据),而后绘制的黄色点覆盖了先绘制的红色weekdays点,看起来像是weekdays变成了黄色。
问题原因
在你的plot命令中,第三个数据源的命令是:
"< grep -e '\^' fraction.csv | sed 's/^//'"
由于整个命令被双引号包裹,shell会解析其中的转义字符:\^会被shell直接转换成^,传给grep的实际正则是^——这是行首锚点,会匹配所有非空行(因为每一行都以行首开头)。因此第三个数据集包含了前两个数据集的所有数据,包括weekdays的全部点,而gnuplot绘制时后画的点会覆盖先画的,所以红色的weekdays点被黄色覆盖,看起来消失了。
解决方案
要让grep正确匹配字面量^字符,需要在shell中正确转义反斜杠,避免shell解析它。有两种可行的修改方式:
- 在双引号中用双反斜杠转义:
plot "< grep -e '\\^' fraction.csv | sed 's/^//'" using 1:($4) title 'fridays' ls 3 with points
这里\\^会被shell解析成\^,传给grep的正则就是匹配字面量^的正确表达式。
- 用单引号包裹grep的匹配模式(更精准):
如果你的fridays数据是行首以^开头的行,直接用单引号包裹匹配模式,避免shell解析:
plot "< grep -e '^\^' fraction.csv | sed 's/^//'" using 1:($4) title 'fridays' ls 3 with points
单引号会让shell完全不解析内部字符,grep会正确匹配行首为^的行。
验证
修改后,单独执行第三个命令确认输出仅包含fridays的数据集:
# 对应第一种修改方式 grep -e '\\^' fraction.csv | sed 's/^//' # 对应第二种修改方式 grep -e '^\^' fraction.csv | sed 's/^//'
再运行gnuplot脚本,三个数据集就会分别显示蓝色、红色、黄色,不会出现覆盖问题。
内容的提问来源于stack exchange,提问作者Grace Sawyer
相关产品推荐
相关产品推荐

