以有效的1秒间隔绘制数据

时间:2015-04-29 09:29:45

标签: r plot

所以我已经做到了这一点(效率低下),但为了将来参考,我想知道是否有更好的方法。

我正在做的是绘制数据包的数量,以及跟踪中每秒发送的数据。代码目前是:

trace$sec = cut(trace$V1, breaks = seq(0, 1800, by = 1), labels = 1:1800)
packet_count_vec = numeric()
data_trans_vec = numeric()
for (i in 0:1800 ) {
  print(i)
  bin = which(trace$sec == i)
  packet_count = 0
  data_trans = 0
  for (j in bin) {
    packet_count = packet_count + 1
    data_trans = data_trans + trace[j,]$V6
  }
  packet_count_vec = c(packet_count_vec, packet_count)
  data_trans_vec = c(data_trans_vec, data_trans)
}
par(mfrow=c(2, 1))
plot(packet_count_vec, type = "l", xlab = "Time (s)", ylab = "Packets")
title("Time Series of Total Packets")
plot(data_trans_vec, type = "l", xlab = "Time (s)", ylab = "Bits")
title("Time Series of Data Transferred")

我所做的是使用cut为我的数据添加第二个时间间隔,然后为每个bin我计算bin中的数字(数据包数),并为每个数据包添加数据(总数是第二次发送的数据)。

可以找到跟踪here,重要的列是:

  • V1 - 数据包发送开始后的时间。
  • V6 - 发送的数据量。

我目前的解决方案速度相当慢(我有1800秒),我想知道下次我如何更有效地做到这一点。

1 个答案:

答案 0 :(得分:1)

假设我正确地浏览了文件,这就是我认为你想要实现的目标。我使用read_delim中的readr来快速读取文件,然后使用dplyr惯用法来转换和汇总数据。我使用ggplot与基础绘图和tidyr在绘图之前再次转换数据。由于在ggplot中使用了构面,因此简化了绘图。

library(dplyr)
library(readr)
library(stringr)
library(tidyr)
library(ggplot2)
library(scales)

trace <- read_delim("trace.txt", delim=" ", col_names=FALSE)
trace %>% 
  mutate(second=as.numeric(str_replace(X1, "\\..*$", ""))) %>%  # only care about the second
  group_by(second) %>%                                          # group by the second
  summarise(`Total Packets`=n(),                                # get packet count
            `Data Transferred (Bits)`=sum(X6)) -> trace         # get data count

head(trace)

## Source: local data frame [6 x 3]
## 
##   second Total Packets Data Transferred (Bits)
## 1      0           151                    5497
## 2      1           203                   11146
## 3      2           170                   13986
## 4      3           163                   10541
## 5      4           152                    6781
## 6      5           147                    9087

gg <- ggplot(gather(trace, Measure, value, -second))
gg <- gg + geom_line(aes(x=second, y=value, color=Measure))
gg <- gg + scale_y_continuous(label=comma)
gg <- gg + facet_wrap(~Measure, ncol=1, scales="free_y")
gg <- gg + labs(x="Time (s)", y=NULL)
gg <- gg + theme_bw()
gg <- gg + theme(legend.position="none")
gg 

enter image description here