Gnuplot在一个折线图中用不同的颜色和破折号组合多种值类型

问题描述

Three charts

我有3条不同的线,其中的颜色及其破折号表示我想要在一张图上显示的不同东西,而不是3条。我该怎么做?

set datafile separator comma
$sample <<EOD
2020-01-01,4,UK,Business
2020-02-01,Business
2020-01-01,Social
2020-02-01,15,Social
2020-01-01,1,USA,25,Social
EOD

set format x '%Y'
set xdata time
set timefmt "%Y-%m-%d"
plot '$sample' u 1:2 title "UK/Business" with linespoints dt 3 lw 5 pt 7 lc "red"
  • plot '$sample' u 1:2 title "USA/Social" with linespoints dt 3 lw 1 pt 7 lc "blue"
  • plot '$sample' u 1:2 title "UK/Social" with linespoints dt 3 lw 5 pt 7 lc "blue"

例如蓝色是“社交”,lw 1(细点)是美国的。

解决方法

请查看手册或help plot。同一图的图元素用逗号分隔。

语法:

  plot {<ranges>} <plot-element> {,<plot-element>,<plot-element>}

为提高可读性,您可以使用\将长代码行分成几行。请注意,在\之后的同一行中,除了回车/换行之外,不允许输入任何字符。

尝试一下:

plot '$sample' u 1:2 title "UK/Business" w lp dt 3 lw 5 pt 7 lc "red",\
     '' u 1:2 title "USA/Social" w lp dt 3 lw 1 pt 7 lc "blue",\
     '' u 1:2 title "UK/Social" w lp dt 3 lw 5 pt 7 lc "blue"

添加 :(取决于两个(字符串)列的过滤器)

您可以使用三元运算符实现过滤器。选中help ternaryhelp strcol。未通过过滤器的值将设置为NaN。如果您仍然希望将点与线连接起来,则需要set datafile missing NaN

代码:

### filtered data with different line colors
reset session
set datafile separator comma

$sample <<EOD
2020-01-01,4,UK,Business
2020-02-01,Business
2020-01-01,Social
2020-02-01,15,Social
2020-01-01,1,USA,25,Social
EOD

myTimeFmt = "%Y-%m-%d"
set format x '%d.%m.%Y' timedate
set key top left
set datafile missing NaN

myFilter(colData,colFilter1,key1,colFilter2,key2) = (strcol(colFilter1) eq key1) && (strcol(colFilter2) eq key2) ?  column(colData) : NaN

plot $sample u (timecolumn(1,myTimeFmt)):(myFilter(2,3,"UK","Business")) w lp dt 3 lw 5 pt 7 lc "red" title "UK/Business",\
     '' u (timecolumn(1,"USA","Social")) w lp dt 3 lw 1 pt 7 lc "blue" title "USA/Social","Social")) w lp dt 3 lw 5 pt 7 lc "blue" title "UK/Social"
### end of code

如果在plot命令中第2、3、4列未更改,则缩短一点...

...
...
myTime(col) = timecolumn(col,myTimeFmt)
myFilter(key1,key2) = (strcol(3) eq key1) && (strcol(4) eq key2) ?  column(2) : NaN

plot $sample u (myTime(1)):(myFilter("UK",\
     '' u (myTime(1)):(myFilter("USA",\
     '' u (myTime(1)):(myFilter("UK","Social")) w lp dt 3 lw 5 pt 7 lc "blue" title "UK/Social"

结果:

enter image description here