在 Gnuplot 中绘制 COVID-19 数据

4

我正在尝试绘制(GNUPlot)包含在CSV文件中的一些COVID-19数据,该文件使用第一行作为时间数据和每列对应的病例数。我想为每个州(每行)制作一个单独的图表,但是没有成功。有什么帮助吗?这是我的绘图脚本。在脚本中使用 plot for [ col = 5:30:1] ... ,因为前4列是州名和地理位置。我认为现在只需关注数据点,并最终弄清如何在图表上显示州名。我从主CSV数据中grep出美国的数据以创建“us.dat”:

set key autotitle columnhead
set term png size 1024, 768
set key outside
set datafile separator ","
set title 'mygraph'
set ylabel 'count'
set xlabel 'time'
set grid
set term png
set output "/tmp/covid19.png"    
plot for [col=5:30:1] "us.dat" using col

以下是"us.dat"文件的一部分:

Province/State,Country/Region,Lat,Long,1/22/20,1/23/20,1/24/20,1/25/20,1/26/20,1/27/20,1/28/20,1/29/20,1/30/20,1/31/20,2/1/20,2/2/20,2/3/20,2/4/20,2/5/20,2/6/20,2/7/20,2/8/20,2/9/20,2/10/20,2/11/20,2/12/20,2/13/20,2/14/20,2/15/20,2/16/20,2/17/20,2/18/20,2/19/20,2/20/20,2/21/20,2/22/20,2/23/20,2/24/20,2/25/20,2/26/20,2/27/20,2/28/20,2/29/20,3/1/20,3/2/20,3/3/20,3/4/20,3/5/20,3/6/20,3/7/20,3/8/20,3/9/20,3/10/20,3/11/20
Washington,US,47.4009,-121.4905,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,267,366
New York,US,42.1657,-74.9481,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,220
California,US,36.1162,-119.6816,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,144,177
Massachusetts,US,42.2302,-71.5301,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,92,95

图像的细节还不够完美:

plot image

2个回答

3
这里是一个纯 gnuplot 版本。
$data <<EOD
Province/State,Country/Region,Lat,Long,1/22/20,1/23/20,1/24/20,1/25/20,1/26/20,1/27/20,1/28/20,1/29/20,1/30/20,1/31/20,2/1/20,2/2/20,2/3/20,2/4/20,2/5/20,2/6/20,2/7/20,2/8/20,2/9/20,2/10/20,2/11/20,2/12/20,2/13/20,2/14/20,2/15/20,2/16/20,2/17/20,2/18/20,2/19/20,2/20/20,2/21/20,2/22/20,2/23/20,2/24/20,2/25/20,2/26/20,2/27/20,2/28/20,2/29/20,3/1/20,3/2/20,3/3/20,3/4/20,3/5/20,3/6/20,3/7/20,3/8/20,3/9/20,3/10/20,3/11/20
Washington,US,47.4009,-121.4905,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,267,366
New York,US,42.1657,-74.9481,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,220
California,US,36.1162,-119.6816,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,144,177
Massachusetts,US,42.2302,-71.5301,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,92,95
EOD

N = 50
array X[N]
array Y[N]

set datafile separator ","

# a dummy plot to extract the row into an array
pl $data us ($0==0? sum[i=1:N](X[i]=strcol(i+4), 0) :\
             (strcol(1) eq "Washington")? sum[i=1:N](Y[i]=column(i+4)) : $0, $0) : 0

set xdata time
set timefmt "%m/%d/%y"

plot X us (X[$1]):(Y[$1]) w lp pt 7

这里输入图片描述

说明:

首先是一个虚拟的情境。当第一行被输入时($0==0),会循环遍历所有列将日期存入数组X。同样地,当列名为Washington时,所有列都会被存入数组Y中。列数和它们的偏移量应该事先知道。

sum函数仅被用作循环。(由于日期行包含字符串,因此提供, 0, 因为字符串无法相加)


2
一种可能的解决方案是使用awk。通过使用它,您可以转置文件并正常使用gnuplot(还要感谢这个很棒的答案:An efficient way to transpose a file in Bash)。您甚至可以在gnuplot内部进行内联操作。
华盛顿州可以按以下方式绘制。
set xdata time
set timefmt "%m/%d/%y"
pl "<awk -F, '{ for (i=5; i<=NF; i++)  { a[NR,i] = $i} } NF>p { p = NF } END { for(j=5; j<=p; j++) {str=a[1,j];for(i=2; i<=NR; i++){str=str\" \"a[i,j];}print str}}' us.dat" using 1:2 w l title "Washington"

第3列将是纽约,第4列是加州,第5列是马萨诸塞州。

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接