使用ggplot2在不同图层中绘制多个ROC曲线

3

我正在尝试使用ggplot2在单个图中绘制多条ROC曲线。以下是我到目前为止的进展:

ggroc2 <- function(columns, data = mtcars, classification = "am",
                   interval = 0.2, breaks = seq(0, 1, interval)){
  require(pROC)
  require(ggplot2)

  #The frame for the plot
  g <- ggplot() + geom_segment(aes(x = 0, y = 1, xend = 1,yend = 0)) +
    scale_x_reverse(name = "Specificity",limits = c(1,0), breaks = breaks, 
expand = c(0.001,0.001)) + 
    scale_y_continuous(name = "Sensitivity", limits = c(0,1), breaks = 
breaks, expand = c(0.001, 0.001)) +
    theme_classic() + coord_equal()

  #The loop to calculate ROC's and add them as new layers
  for(i in 1:length(columns)){
    croc <- roc(data[,classification], data[,columns[i]]) 
    plotx <- rev(croc$specificities)
    ploty <- rev(croc$sensitivities)
    g <- g + geom_step(aes(x=plotx, y=ploty))
  }

  g
}



#Sample graph
ggroc2(c("mpg", "disp", "drat", "wt"))

问题在于`columns`列表中只有最后一个参数会被绘制。通过阅读这个问题的答案,我确定问题必须与`aes()`和惰性求值有关。该示例使用了`geom_segment()`,并且在完全删除`aes()`后问题得到了解决。这对我不起作用,因为我需要以某种方式映射数据。当我在此处删除`aes()`时,没有任何内容被绘制。如何解决依赖于`aes()`的`geom_`中的惰性求值问题?

1
答案展示了使用变量名和aes_string作为解决方法。 - aosmith
1
关于重复问题,感谢您指出。我正在尝试决定是否应该点击“解决我的问题!”按钮,还是“我将编辑以解释如何”。我的问题似乎真的是一个重复的问题,但我发现下面的答案比重新调整我的数据到长格式更加优雅和高效。我该怎么办? - naco
1
我选择这个作为重复问题的原因之一是它展示了使用data.frame的解决方法。这里给出的答案采用了同样的方式。 - aosmith
1个回答

2
这是您代码的工作版本。
最终的图形结果不是很好,需要改进。
ggroc2 <- function(columns, data = mtcars, classification = "am",
                   interval = 0.2, breaks = seq(0, 1, interval)){
  require(pROC)
  require(ggplot2)

  #The frame for the plot
  g <- ggplot() + geom_segment(aes(x = 0, y = 1, xend = 1,yend = 0)) +
    scale_x_reverse(name = "Specificity",limits = c(1,0), breaks = breaks, 
expand = c(0.001,0.001)) + 
    scale_y_continuous(name = "Sensitivity", limits = c(0,1), breaks = 
breaks, expand = c(0.001, 0.001)) +
    theme_classic() + coord_equal()

  #The loop to calculate ROC's and add them as new layers
  cols <- palette()
  for(i in 1:length(columns)){
    croc <- roc(data[,classification], data[,columns[i]]) 
    sens_spec <- data.frame(spec=rev(croc$specificities),
                            sens=rev(croc$sensitivities))
    g <- g + geom_step(aes(x=spec, y=sens), data=sens_spec, col=cols[i], lwd=1)
  }
  g
}

#Sample graph
ggroc2(c("mpg", "disp", "drat", "wt"))

enter image description here


1
最终的图形结果不太好,应该改进。您是指重叠的线条吗?无论如何,非常有说服力的答案,谢谢。我非常清楚地理解了。从这里开始进一步处理应该很容易。 - naco
2
@naco 是的,我不喜欢重叠的线条。无论如何,很高兴你发现了我的答案有用! - Marco Sandri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接