用晶格创建多面板ROC曲线图

时间:2014-07-09 23:38:55

标签: r plot lattice

我想创建一个包含两个面板的图,每个面板包含两个ROC曲线。为了介绍我的(失败)方法,我生成包含真实标签的数据框,四种方法的标签(每种方法对应)

N <- 20 
TF <- rep(c(0,1),each=N/2)
pred <- method <- true <- NULL
for (imethod in 1 : 4){
  pred <- c(pred,seq(-1,1,length.out=N) + rnorm(N) )
  method <- c(method,rep(imethod,N))
  true <- c(true,TF)
 }
 dat.roc <-  
    data.frame(true=true,pred=pred,method=method,panel=rep(1:2,each=length(method)/2))

 xyplot(true ~ pred|panel, data=dat.roc,groups=method,
        xlim=c(0,1),xlab="1-specificity",
        ylab="sensitivity",
        panel=function(x,y,...){
           DD <- table(-x,y)
           sens <- cumsum(DD[,2])/sum(DD[,2])
           mspec <- cumsum(DD[,1])/sum(DD[,1])
           panel.xyplot(mspec,sens,type="l",...)
           panel.abline(0,1)
    })

该图有两个面板,每个面板只有一条ROC曲线(有两种颜色)!如何在每个面板中正确指定晶格返回两条ROC曲线?

1 个答案:

答案 0 :(得分:2)

由于您在面板功能中使用cumsum,因此您需要确保为每个组创建不同的图,而不仅仅是每个面板。一种方法是使用panel.superpose面板功能,因此您可以将代码更改为

xyplot(true ~ pred|panel, data=dat.roc,groups=method,
    xlim=c(0,1),xlab="1-specificity",
    ylab="sensitivity",
    panel=panel.superpose,
    panel.groups=function(x,y,type, ...){
        DD <- table(-x,y)
        sens <- cumsum(DD[,2])/sum(DD[,2])
        mspec <- cumsum(DD[,1])/sum(DD[,1])
        panel.xyplot(mspec,sens,type="l",...)
        panel.abline(0,1)
})

产生情节

enter image description here