【问题标题】:Multi-line Time Series Chart in ggplot2ggplot2中的多线时间序列图
【发布时间】:2018-09-11 02:54:15
【问题描述】:

我有一个包含两列“主机”和“日期”的数据框;它描述了在七个月的特定日期针对多个不同服务器的一系列网络攻击。

这是数据的样子,

> 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 条记录,从 03/03/2013 到 08/09/2013,例如

> 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 来实现这一点.有九个唯一的主机名,因此图表将显示九行。

谢谢!

【问题讨论】:

  • 您没有数据中的攻击次数,如果有,它在哪里?
  • 每一行似乎是一个单独的观察,因此可以通过总结来计算攻击次数。
  • 不,攻击次数必须计入实际数据帧本身——这应该是我的第一步吗?
  • 请在上面的示例数据中添加更多日期。

标签: r ggplot2


【解决方案1】:

这是一种方法。

先按日期汇总计数频率。

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")

【讨论】:

  • 这是完美的,谢谢!我必须将 'group=1' 更改为 'group=host' 以获得点之间的平滑线,否则它会显示为一种条形图。
  • 好一个。您可以使用dplyr,这是plyr 的下一次迭代。
  • @MKR 谢谢!本来可以做dc &lt;- da %&gt;% group_by(host,date) %&gt;% dplyr::summarise(freq = n()),但我认为它会更长一点。
  • 绝对正确!!但我的意思是你可以使用dplyr::count
  • @MKR 有意义:)
【解决方案2】:

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

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

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

【讨论】: