Gnuplot 2个月之间的百分比差异

时间:2014-12-17 17:52:07

标签: gnuplot percentage

我有一个来自5年恶意软件数据的csv文件,有2列日期和每个日期的ips有1个或更多ips示例

1/5/2013 12.234.123
1/5/2013 45.123.566
1/5/2013 100.546.12
1/6/2013 42.153.756
3/4/2014 75.356.258 etc... (every day for 5 years)

现在我试图获得每月例子之间的百分比差异:

November 2014 - 10%
December 2014 - 15%

我试图将百分比放在y轴和x2轴上,但我得到一些疯狂的结果我是gnuplot的新手,我仍然在这里学习它是我现在的代码:

set title 'Results Per Month'
set xlabel 'Date'
set ylabel 'Percentage'
set terminal png size 2800,900
set datafile sep ','
set xdata time

set timefmt '%Y/%m/%d'
set xrange['2009/3/22':'2014/12/02']
set xtics 30*24*60*60
set format x '%Y/%m'

set autoscale x2fix
set x2tics 
set x2range[0:*]
set format x2 "%g %%"

set xtics nomirror rotate by -90
set grid ytics xtics
set ytics 10
set yrange [0:*]
set term png
set output 'file.png'

plot 'export.csv' using (timecolumn(1) - (tm_mday(timecolumn(1))-1)*24*60*60):(1) smooth frequency w lp pt 7 ps 2 notitle, \
'' using (($1-$2)/$1*100):x2ticlabels(2) axes x2y1 with points ps 2 lw 2

1 个答案:

答案 0 :(得分:2)

我建议你使用一些外部脚本进行这种预处理(你也可以在运行中这样做)。是的,你可以通过两个步骤在gnuplot中完成这个任务,但是可能变得非常复杂,并且需要对gnuplot有更深刻的了解。

这是一个工作脚本,但我不会详细介绍实际实现的许多不同方面:

set xdata time
set timefmt '%Y/%m/%d'
set datafile separator ','

set table 'temporaryfile.dat'
set format x '%Y/%m/%d'
plot 'export.csv' using (timecolumn(1) - (tm_mday(timecolumn(1))-1)*24*60*60):(1) smooth frequency 
unset table

set y2tics
set ytics nomirror
set timefmt '"%Y/%m/%d"'
set format x '%b %Y'
set xtics rotate by 90 right

set datafile separator white
set yrange[0:*]
x0=x1=0
plot 'temporaryfile.dat' using 1:(strcol(3) eq "i" ? $2 : 1/0) w lp pt 7 ps 2 title 'IP count', \
     '' using 1:(x1=x0, x0=$2, strcol(3) eq "i" ? ($0 == 0 || x0 == 0 ? 0 : (x0-x1)/x0 * 100.0) : 1/0) axes x1y2 w lp title 'percentual change'

基本上,首先将smooth frequency的结果数据绘制到第二个数据文件中。然后你可以绘制这个,并计算百分比。

请注意,我使用了与您的测试数据(以及之前问题的数据)相对应的时间格式,这与您在脚本中的内容不一致!请注意这一点。

另请注意,实际绘图之前的timefmt必须通过在tmp.dat的日期周围写的引号来扩展。

最后,strcol(3) eq 'i'是绕过gnuplot错误所必需的,这会导致最后一行被写入无效数据。

enter image description here