ggplot2

时间:2018-04-01 19:40:50

标签: r ggplot2

我有一个包含两列的数据框,' host'和' date&#39 ;;它描述了在七个月的特定日期对一些不同服务器的一系列网络攻击。

这是数据的样子,

> china_atks %>% head(100)
                host       date
1     groucho-oregon 2013-03-03
2     groucho-oregon 2013-03-03
...
46 groucho-singapore 2013-03-03
48 groucho-singapore 2013-03-04
...

groucho-oregon' groucho-signapore'等等,是攻击所针对的服务器的主机名。

大约有190,000条记录,涵盖2013年3月3日至2013年9月8日,例如

> unique(china_atks$date)
  [1] "2013-03-03" "2013-03-04" "2013-03-05" "2013-03-06" "2013-03-07" 
"2013-03-08" "2013-03-09"
  [8] "2013-03-10" "2013-03-11" "2013-03-12" "2013-03-13" "2013-03-14" 
"2013-03-15" "2013-03-16"
 [15] "2013-03-17" "2013-03-18" "2013-03-19" "2013-03-20" "2013-03-21" 
"2013-03-22" "2013-03-23"
...

我想创建一个多行时间序列图表,可以显示每个服务器每天在日期范围内收到的攻击次数,但我无法弄清楚如何将数据传递给ggplot实现这一目标。有九个独特的主机名,因此图表将显示九行。

谢谢!

2 个答案:

答案 0 :(得分:3)

这是实现此目的的一种方法。

首先按日期汇总计数频率。

library(plyr)
df <- plyr::count(da,c("host", "date"))

然后进行绘图。

ggplot(data=df, aes(x=date, y=freq, group=1)) + 
  geom_line(aes(color = host))  

数据

 da <- structure(list(host = structure(1:4, .Label = c("groucho-eu", 
    "groucho-oregon", "groucho-singapore", "groucho-tokyo"), class = "factor"), 
        date = structure(c(1L, 1L, 1L, 1L), .Label = "2013-03-03", class = "factor"), 
        freq = c(1L, 4L, 2L, 1L)), .Names = c("host", "date", "freq"
    ), row.names = c(NA, -4L), class = "data.frame")

答案 1 :(得分:3)

ggplot2库能够执行统计信息。因此,一个选项可能是让ggplot处理计数/频率。这应绘制多条线(每组一条)

ggplot(df, aes(x=Date, colour = host, group = host)) + geom_line(stat = "count")

注意:确保将host转换为factor以使行具有离散颜色。