如何使用CSV时间数据在R中创建直方图?

时间:2011-12-22 10:21:41

标签: r time ggplot2 plyr

我有24小时的日志CSV数据,如下所示:

svr01,07:17:14,'u1@user.de','8.3.1.35'
svr03,07:17:21,'u2@sr.de','82.15.1.35'
svr02,07:17:30,'u3@fr.de','2.15.1.35'
svr04,07:17:40,'u2@for.de','2.1.1.35'

我用tbl <- read.csv("logs.csv")

读取数据

如何在直方图中绘制此数据以查看每小时的点击次数? 理想情况下,我会得到4条代表每小时每次srv01,srv02,srv03,srv04的点击次数。

感谢您在这里帮助我!

2 个答案:

答案 0 :(得分:9)

我不知道我是否理解你,所以我会将我的答案分成两部分。第一部分是如何将时间转换为可用于绘图的矢量。

a)将数据转换为数小时:

  #df being the dataframe
  df$timestamp <- strptime(df$timestamp, format="%H:%M:%S")
  df$hours <-  as.numeric(format(df$timestamp, format="%H"))
  hist(df$hours)

这为您提供了所有服务器上的命中直方图。如果你想分割直方图这是单向,但当然还有很多其他的:

b)使用ggplot2

制作直方图
 #install.packages("ggplot2")
  require(ggplot2)
  ggplot(data=df) + geom_histogram(aes(x=hours), bin=1) +  facet_wrap(~ server)
  # or use a color instead
  ggplot(data=df) + geom_histogram(aes(x=hours, fill=server), bin=1)

c)您还可以使用其他套餐:

 require(plotrix)
 l <- split(df$hours, f=df$server)
 multhist(l)

以下给出了这些例子。第三个比较容易,但我认为ggplot2看起来更好。

修改

以下是这些解决方案的样子

第一个解决方案: enter image description here

第二种解决方案: enter image description here

第三种解决方案: enter image description here

答案 1 :(得分:8)

示例数据集:

dat = data.frame(server = paste("svr", round(runif(1000, 1, 10)), sep = ""),
                 time = Sys.time() + sort(round(runif(1000, 1, 36000))))

我使用的技巧是创建一个新变量,该变量仅指定记录命中的小时数:

dat$hr = strftime(dat$time, "%H")

现在我们可以使用一些plyr magick:

hits_hour = count(dat, vars = c("server","hr"))

创建情节:

ggplot(data = hits_hour) + geom_bar(aes(x = hr, y = freq, fill = server), stat="identity", position = "dodge")

看起来像:

enter image description here

我真的不喜欢这个情节,我更赞成:

ggplot(data = hits_hour) + geom_line(aes(x = as.numeric(hr), y = freq)) + facet_wrap(~ server, nrow = 1)

看起来像:

enter image description here

将所有构面放在一行可以轻松比较服务器之间的命中数。使用真实数据而不是随机数据时,这看起来会更好。