2

我的数据看起来像这个例子:

    dataExample<-data.frame(Time=seq(1:10),
        Data1=runif(10,5.3,7.5),
        Data2=runif(10,4.3,6.5),
        Application=c("Substance1","Substance1","Substance1",
        "Substance1","Substance2","Substance2","Substance2",
        "Substance2","Substance1","Substance1"))
        dataExample

           Time    Data1    Data2 Application
        1     1 6.511573 5.385265  Substance1
        2     2 5.870173 4.512775  Substance1
        3     3 6.822132 5.109790  Substance1
        4     4 5.940528 6.281412  Substance1
        5     5 7.269394 4.680380  Substance2
        6     6 6.122454 6.015899  Substance2
        7     7 5.660429 6.113362  Substance2
        8     8 6.649749 4.344978  Substance2
        9     9 7.252656 4.764667  Substance1
        10   10 7.204440 5.835590  Substance1

我想指出在什么时候应用了不同于 的任何物质dataExample$Application[1]

在这里,我向您展示了绘制此图的方式,但我假设使用 ggplot 有一种更简单的方法。

library(reshape2)
library(ggplot)

plotDataExample<-function(DataFrame){
  longDF<-melt(DataFrame,id.vars=c("Time","Application"))
  p=ggplot(longDF,aes(Time,value,color=variable))+geom_line()

  maxValue=max(longDF$value)
  minValue=min(longDF$value)

  yAppLine=maxValue+((maxValue-minValue)/20)
  xAppLine1=min(longDF$Time[which(longDF$Application!=longDF$Application[1])])
  xAppLine2=max(longDF$Time[which(longDF$Application!=longDF$Application[1])])
  lineData=data.frame(x=c(xAppLine1,xAppLine2),y=c(yAppLine,yAppLine))

  xAppText=xAppLine1+(xAppLine2-xAppLine1)/2
  yAppText=yAppLine+((maxValue-minValue)/20)
  appText=longDF$Application[which(longDF$Application!=longDF$Application[1])[1]]
  textData=data.frame(x=xAppText,y=yAppText,appText=appText)

  p=p+geom_line(data=lineData,aes(x=x, y=y),color="black")
  p=p+geom_text(data=textData,aes(x=x,y=y,label = appText),color="black")
  return(p)
}
plotDataExample(dataExample)

在此处输入图像描述

问题: 您是否知道获得类似结果的更好方法,以便我可以指出多个因素(例如 Substance3、Substance4 ...)。

4

1 回答 1

1

首先,使新的样本数据具有2个以上的水平并重复两次Substance2

dataExample<-data.frame(Time=seq(1:10),
                        Data1=runif(10,5.3,7.5),
                        Data2=runif(10,4.3,6.5),
                        Application=c("Substance1","Substance1","Substance2",
                                      "Substance2","Substance1","Substance1","Substance2",
                                      "Substance2","Substance3","Substance3"))

没有将此作为显示每个步骤的功能。

将新列添加groups到原始数据框 - 这包含用于分组的标识符Applications- 如果物质发生变化,则形成新组。

dataExample$groups<-c(cumsum(c(1,tail(dataExample$Application,n=-1)!=head(dataExample$Application,n=-1))))

将数据行转换为长格式数据。

longDF<-melt(dataExample,id.vars=c("Time","Application","groups"))

计算物质标识符的位置。使用ddply()库中的函数plyr。对于计算,仅使用与第一个Application值不同的数据(即subset())。然后Applicationgroups用于数据分组。计算 x 轴上的开始、中间和结束位置,y 值取最大值value+0.3。

library(plyr)    
lineData<-ddply(subset(dataExample,Application != dataExample$Application[1]),
      .(Application,groups),
                summarise,minT=min(Time),maxT=max(Time),
                meanT=mean(Time),ypos=max(longDF$value)+0.3)

ggplot()现在用and绘制 longDF 数据,并在 plot with和 textgeom_line()上面添加段,使用 new data frame 。geom_segment()annotate()lineData

ggplot(longDF,aes(Time,value,color=variable))+geom_line()+
  geom_segment(data=lineData,aes(x=minT,xend=maxT,y=ypos,yend=ypos),inherit.aes=FALSE)+
  annotate("text",x=lineData$meanT,y=lineData$ypos+0.1,label=lineData$Application)

在此处输入图像描述

于 2013-04-17T12:54:32.347 回答