Как создать гистограмму в R с данными времени CSV? - PullRequest
3 голосов
/ 22 декабря 2011

У меня есть данные 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 ]

9 голосов
/ 22 декабря 2011

Я не знаю, правильно ли я вас понял, поэтому я разделю свой ответ на две части.Первая часть состоит в том, как преобразовать ваше время в вектор, который вы можете использовать для построения графиков.

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)

в) Вы также можете использовать другой пакет:

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

Примеры приведены ниже.Третье облегчает сравнение, но я думаю, что ggplot2 выглядит лучше.

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

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

первое решение: enter image description here

второе решение: enter image description here

третье решение: enter image description here

8 голосов
/ 22 декабря 2011

Пример набора данных:

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

Объединение всех граней в одинСтрока позволяет легко сравнивать количество попаданий между серверами.Это будет выглядеть еще лучше при использовании реальных данных вместо моих случайных данных.

...