Как создать гистограмму в 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 просто выглядит лучше, я думаю.

РЕДАКТИРОВАТЬ

Вот как будут выглядеть эти решения

Первое решение:

Второе решение:

третье решение:

Другие вопросы по тегам