将组件添加到for循环中的ggplot时出错

时间:2018-04-04 15:06:27

标签: r ggplot2 roc

我正在尝试使用下面的代码在一个图上绘制许多ROC图。 x是一个向量列表(每个包含x坐标),y是一个列表向量(每个包含y坐标)。

plotROC<- function(x, y, label=NA) {
  p <- ggplot() + ggtitle("ROC Plot") + xlab("False Positive Rate") + 
    ylab("True Positive Rate") + xlim(c(0,1)) + ylim(c(0, 1)) + 
    geom_segment(aes(x=0, y=0, xend=1, yend=1), colour="black")
  for (i in 1:length(x)) {
    auc <- AUC(x[[i]], y[[i]])
    lab <- ifelse(is.na(label[i]), "", paste(label[i], "\n", sep=""))
    p <- p + geom_line(
      aes(x[[i]], y[[i]], colour=paste(lab, "AUC: ", 
                             formatC(auc, format="f", 
                                     digits=2), sep="")))
  }
  p + scale_color_brewer(palette=palette) + 
    theme(legend.title=element_blank())
}

由于某种原因,该功能仅绘制最终的ROC图。如果有人可以提供帮助,我会非常感激!

谢谢,

杰克

1 个答案:

答案 0 :(得分:1)

您应该使用data.frameggplot2合作,这对您来说会更容易。

例如,您可以轻松地将数据转换为data.frame:

x = list(runif(4), runif(4))
y = list(runif(4), runif(4))

df = Reduce(rbind, mapply(function(x, y, z) {
  data.frame(x=x, y=y, z=z)
}, x, y, 1:length(x), SIMPLIFY = FALSE))
df$z = as.factor(df$z)

请注意,我添加了一个z变量,可以对应您想要的任何内容。我把它转换成因子,以便ggplot将其视为因子而不是连续的。

然后你的情节可以像这样定义:

ggplot(df, aes(x=x, y=y, color=z)) + 
  geom_line() +
  ggtitle("ROC Plot") +
  xlab("False Positive Rate") + 
  ylab("True Positive Rate") + 
  xlim(c(0,1)) + ylim(c(0, 1)) + 
  geom_segment(aes(x=0, y=0, xend=1, yend=1), colour="black")

使用for循环(这不是一个留在for循环中的好主意),这段代码对我有用:

library(ggplot2)

plotROC<- function(x, y, label=NA) {

  p <- ggplot() + 
    ggtitle("ROC Plot") +
    xlab("False Positive Rate") + 
    ylab("True Positive Rate") + 
    xlim(c(0,1)) + ylim(c(0, 1)) + 
    geom_segment(aes(x=0, y=0, xend=1, yend=1), colour="black")

  for (i in 1:length(x)) {
    p <- p + geom_line(
      aes(x[[i]], y[[i]]))
  }

  return(
    p + 
      scale_color_brewer(palette="YlOrRd") + 
      theme(legend.title=element_blank())
  )

}

x = list(runif(4), runif(4))
y = list(runif(4), runif(4))

plotROC(x, y)