我有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的点击次数。
感谢您在这里帮助我!
答案 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
看起来更好。
修改强>
以下是这些解决方案的样子
第一个解决方案:
第二种解决方案:
第三种解决方案:
答案 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")
看起来像:
我真的不喜欢这个情节,我更赞成:
ggplot(data = hits_hour) + geom_line(aes(x = as.numeric(hr), y = freq)) + facet_wrap(~ server, nrow = 1)
看起来像:
将所有构面放在一行可以轻松比较服务器之间的命中数。使用真实数据而不是随机数据时,这看起来会更好。