如何使用 Gnuplot 使用字符串绘制周数并控制 xtics 增量?

How to plot week number with string and control xtics increment using Gnuplot?

我如何绘制带有字符串 (W) 的时间样本(第 3 列)?

以及如何使用时间格式控制 xtics 增量?

几行数据:

France,FR,2020-W09,118,3318,67012883,4.95128675481698,3.55635925256178,TESSy
France,FR,2020-W10,996,11101,67012883,16.5654714482288,8.97216466984956,TESSy
France,FR,2020-W11,4297,29623,67012883,44.2049329529667,14.5056206326166,TESSy
France,FR,2020-W12,10595,73235,67012883,109.28495644636,14.4671263740015,TESSy
France,FR,2020-W13,24156,122870,67012883,183.35280396756,19.6598030438675,TESSy
France,FR,2020-W14,30304,127029,67012883,189.55907329043,23.8559698966378,TESSy
France,FR,2020-W15,24925,140316,67012883,209.386604065371,17.7634767239659,TESSy

我的脚本:

#https://www.ecdc.europa.eu/en/publications-data/covid-19-testing

#Data (105,77K) here :
system("wget https://opendata.ecdc.europa.eu/covid19/testing/csv -P $PWD -O testing.csv")

reset
set term wxt font ',11' size 1200,800

set datafile separator ","
set grid
#set key at screen 0.9, 0.9


timefmt = "%Y-%s%W"
set xdata time
set xtics format timefmt timedate rotate by -45
SECPERWEEK = 3600.*24.*7.
Y_W(col) = timecolumn(col,timefmt) + SECPERWEEK * (strcol(col)[2:3] - 1)

plot '< grep France testing.csv' u (Y_W(3)):4 notitle w l

谢谢

这是我将如何做的建议。它可能并不明显,看起来可能有点复杂,但它是一个 gnuplot-only 解决方案。 因为我没有 运行 Linux,所以我没有 grep,这就是为什么我在独立于平台的 gnuplot 本身中定义 myFilter()。 每次此过滤器命中时,计数器 t 都会增加一个,其优点是数据可以包含交错的国家/地区组合。我认为这也是 grep 所允许的。这里唯一的假设是周数是(升序)顺序,它们不会被排序。

我想这里没有必要将 x 轴作为时间格式。 如果缺少日历周并且您想为它们保留相应的间隔,情况会有所不同。 使用 myOffset=0myEvery=2 可以设置要显示多少个 x-tic 标签。 当然还有改进的余地,我相信还有其他解决方案……所以,作为一个起点……

代码:

### plot filtered data with custom xtics
reset session

$Data <<EOD
France,FR,2020-W09,118,3318,67012883,4.95128675481698,3.55635925256178,TESSy
France,FR,2020-W10,996,11101,67012883,16.5654714482288,8.97216466984956,TESSy
France,FR,2020-W11,4297,29623,67012883,44.2049329529667,14.5056206326166,TESSy
Luxembourg,LU,2020-W11,11,222,33333333,44.4444444444444,55.5555555555555,fghij
Luxembourg,LU,2020-W12,11,222,33333333,44.4444444444444,55.5555555555555,fghij
France,FR,2020-W12,10595,73235,67012883,109.28495644636,14.4671263740015,TESSy
France,FR,2020-W13,24156,122870,67012883,183.35280396756,19.6598030438675,TESSy
Belgium,BE,2020-W13,1111,222222,33333333,444.44444444444,55.5555555555555,abcde
Belgium,BE,2020-W14,1111,222222,33333333,444.44444444444,55.5555555555555,abcde
France,FR,2020-W14,30304,127029,67012883,189.55907329043,23.8559698966378,TESSy
France,FR,2020-W15,24925,140316,67012883,209.386604065371,17.7634767239659,TESSy
EOD

set datafile separator comma
set datafile missing NaN
set xtics rotate by -45

myFilter(dcol,fcol,key) = strcol(fcol) eq key ? (t=t+1, column(dcol)) : NaN
myXtic(col) = sprintf("%s",(t+myOffset)% myEvery ? "" : strcol(col))
myKey = 'France'
myOffset = 0
myEvery = 2

plot t=1 $Data u (t):(myFilter(4,1,myKey)):xtic(myXtic(3)) w lp pt 7 title myKey
### end of code

结果:

基本错误是 Y_W 函数在错误的列中查找周数。它应该是子字符串 7 到 8 而不是 2 到 3。

Y_W(col) = timecolumn(col,"%Y") + SECPERWEEK * (strcol(col)[7:8])

正如 theozh 在此 中所解释的,gnuplot 默认使用美国周数,而不是 ISO 8601,因此我没有在此处解决。