【问题标题】:How to plot week number with string and control xtics increment using Gnuplot?如何用字符串绘制周数并使用 Gnuplot 控制 xtics 增量?
【发布时间】:2023-03-21 21:35:01
【问题描述】:

如何绘制这次带有字符串 (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


    【解决方案1】:

    这是我将如何做的建议。它可能并不明显,看起来可能有点复杂,但它是一个 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
    

    结果:

    【讨论】:

    • 感谢@theozh 的回答。我不知道 Gnuplot 可以使用这种过滤器。对 Windows 用户非常有用
    • @Suntory 不客气。编辑:我通过定义函数myXtic() 增加了绘图命令的可读性。是的,三元运算符(检查help ternary)在很多情况下都非常有用。
    【解决方案2】:

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

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

    正如theozh 在answer 中解释的那样,gnuplot 默认使用美国周数,而不是 ISO 8601,所以我在这里没有解决这个问题。

    【讨论】:

    • 感谢@meuh 的回复。我理解我关于子字符串和星期格式的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多