Как создать гистограмму в R с данными времени CSV?
У меня есть данные CSV журнала за 24 часа, который выглядит следующим образом:
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 ответа
Пример набора данных:
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)
Который выглядит как:
Объединение всех аспектов в один ряд позволяет легко сравнивать количество обращений к серверам. Это будет выглядеть еще лучше при использовании реальных данных вместо моих случайных данных.
Я не знаю, правильно ли я вас понял, поэтому я разделю свой ответ на две части. Первая часть - как преобразовать ваше время в вектор, который вы можете использовать для построения графиков.
а) Преобразование ваших данных в часы:
#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)
Это дает вам гистограмму хитов по всем серверам. Если вы хотите разделить гистограммы, это один из способов, но, конечно, есть множество других:
б) Составление гистограммы с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)
в) Вы также можете использовать другой пакет:
require(plotrix)
l <- split(df$hours, f=df$server)
multhist(l)
Примеры приведены ниже. Третье облегчает сравнение, но ggplot2
просто выглядит лучше, я думаю.
РЕДАКТИРОВАТЬ
Вот как будут выглядеть эти решения
Первое решение:
Второе решение:
третье решение: