用时间点分类纵向数据的意大利面条图

时间:2013-12-05 06:57:35

标签: r plot ggplot2

我有一个包含纵向数据的数据框,如下所示

  

测试

    Names     hr1    hr2    hr3    hr4      workhr_bin
      41     80     76     70     60               7
      42     80     74     75     NA               8
      43     85     NA     60     65               6
      44     NA     NA     NA     60               3
      45     80     70     NA     NA               8
      46     NA     NA     NA     60               3

hr1hr2hr3hr4的变量包括“名称”列下主题的重复定时间隔的报告营业时间。 “workhr_bin”列包括使用分位数函数获得的区间。共有十个箱子,1:10。

我正在尝试生成多个意大利面条,每小时都有垃圾箱。基本上它应该产生10个图,一个用于bin 1中的数据的图,另一个用于数据bin 2的图等。

我尝试过:

head(melt(test[,c(2:6)]))

但我最终得到了workhr_bin变量和一个这样的文件:

  variable value
1   hours1    80
2   hours1    80
3   hours1    85
4   hours1    NA
5   hours1    80
6   hours1    NA

我也试过

melt(test, id.var = "Names")

我最终还是workhr_bin变量也消失了

   Names variable value
    41   hr1      80.00
    42   hr1      80.00
    43   hr1      85.00

我尝试使用latticeggplot2,但出于某种原因,我无法将数据格式正确,以生成代表每个bin中样本的意大利面10个图。

基本上我需要一个数据框:

Names    variable     value    workhr_bin
    41   hr1      80.00             7
    42   hr1      80.00             8
    43   hr1      85.00             6

然后我希望能够在x.axis上创建一个带有“变量”的bin-faceted多色意大利面图(由hr1hr2hr3组成,{ {1}})和y轴上的相应“值”。 enter image description here

1 个答案:

答案 0 :(得分:4)

您应该学习reshape2::melt的文档。

DF <- read.table(text="    Names     hr1    hr2    hr3    hr4      workhr_bin
      41     80     76     70     60               7
      42     80     74     75     NA               8
      43     85     NA     60     65               6
      44     NA     NA     NA     60               3
      45     80     70     NA     NA               8
      46     NA     NA     NA     60               3", header=TRUE)

library(reshape2)
DF_melt <- melt(DF, id.vars=c("Names", "workhr_bin"))
#make time numeric
DF_melt$variable <- as.numeric(gsub("hr", "", DF_melt$variable))

library(ggplot2)
p <- ggplot(DF_melt, aes(x=variable, y=value, color=factor(Names))) +
  geom_line() +
  geom_point() +
  facet_grid(workhr_bin ~ .)

print(p)

(这导致ggplot2发出警告,因为没有足够的数据。我假设您的真实数据集不会出现此问题。)