pos*_*eid 3 time r 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'
Run Code Online (Sandbox Code Playgroud)
我用它读了数据 tbl <- read.csv("logs.csv")
如何在直方图中绘制此数据以查看每小时的点击次数?理想情况下,我会得到4个柱子,表示每小时每个srv01,srv02,srv03,srv04的点击次数.
谢谢你在这里帮助我!
我不知道我是否理解你,所以我将我的答案分成两部分.第一部分是如何将时间转换为可用于绘图的矢量.
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)
Run Code Online (Sandbox Code Playgroud)
这为您提供了所有服务器的命中直方图.如果你想分割直方图,这是一种方式,但当然还有很多其他方法:
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)
Run Code Online (Sandbox Code Playgroud)
c)您还可以使用另一个包:
require(plotrix)
l <- split(df$hours, f=df$server)
multhist(l)
Run Code Online (Sandbox Code Playgroud)
示例如下.第三个比较容易,但ggplot2我认为只是看起来更好.
编辑
以下是这些解决方案的样子
第一个解决方

二解决方案:

第三种方案:

示例数据集:
dat = data.frame(server = paste("svr", round(runif(1000, 1, 10)), sep = ""),
time = Sys.time() + sort(round(runif(1000, 1, 36000))))
Run Code Online (Sandbox Code Playgroud)
我使用的技巧是创建一个新变量,它只指定记录命中的小时数:
dat$hr = strftime(dat$time, "%H")
Run Code Online (Sandbox Code Playgroud)
现在我们可以使用一些plyr魔法:
hits_hour = count(dat, vars = c("server","hr"))
Run Code Online (Sandbox Code Playgroud)
并创建情节:
ggplot(data = hits_hour) + geom_bar(aes(x = hr, y = freq, fill = server), stat="identity", position = "dodge")
Run Code Online (Sandbox Code Playgroud)
看起来像:

我真的不喜欢这个情节,我更赞成:
ggplot(data = hits_hour) + geom_line(aes(x = as.numeric(hr), y = freq)) + facet_wrap(~ server, nrow = 1)
Run Code Online (Sandbox Code Playgroud)
看起来像:

将所有方面放在一行可以轻松比较服务器之间的命中数.使用真实数据而不是随机数据时,这看起来会更好.
| 归档时间: |
|
| 查看次数: |
6697 次 |
| 最近记录: |