5

我在这里是一个完全的 R 初学者,对这个问题有相应的复杂程度。

我正在使用 R 中的 ROCR 包来生成 ROC 曲线的绘图数据。然后我使用 ggplot2 绘制情节。像这样的东西:

library(ggplot2)
library(ROCR)

inputFile <- read.csv("path/to/file", header=FALSE, sep=" ", colClasses=c('numeric','numeric'), col.names=c('score','label'))

predictions <- prediction(inputFile$score, inputFile$label)
auc <- performance(predictions, measure="auc")@y.values[[1]]

rocData <- performance(predictions, "tpr","fpr")
rocDataFrame <- data.frame(x=rocData@x.values[[1]],y=rocData@y.values[[1]])

rocr.plot <- ggplot(data=rd, aes(x=x, y=y)) + geom_path(size=1)
rocr.plot <- rocr.plot + geom_text(aes(x=1, y= 0, hjust=1, vjust=0, label=paste(sep = "", "AUC = ",round(auc,4))),colour="black",size=4)

这适用于绘制单个 ROC 曲线。但是,我想做的是在整个目录中读取输入文件的价值 - 每个分类器测试结果一个文件 - 并制作所有 ROC 曲线的 ggplot2 多面图,同时仍将 AUC 分数打印到每个图中。

我想了解实现此目的的“正确” R 风格方法是什么。我确信我可以通过让一个循环遍历目录中的所有文件并为每个文件创建一个单独的数据框,然后让另一个循环创建多个图,并以某种方式让 ggplo2 将所有这些图输出到同一表面。但是,这不允许我使用 ggplot2 的内置分面,我认为这是正确的方法。不过,我不确定如何将我的数据转换为适合刻面使用的形状。我是否应该将所有数据框合并为一个,并为每个合并的块命名(例如文件名)并对其进行分面?如果是这样,是否有图书馆或推荐的做法来实现这一点?

感谢您的建议。我仍在研究 R 中的最佳实践,因此我宁愿获得专家的建议,而不是仅仅修改代码以使代码看起来更像我习惯的普通声明性编程语言。

编辑:我最不清楚的是,当使用 ggplot2 的内置分面功能时,我是否仍然能够将自定义字符串(AUC 分数)输出到它将生成的每个图中。

4

1 回答 1

13

这是一个如何生成您所描述的绘图的示例。我使用内置数据集quakes

该代码执行以下操作:

  • 加载ggplot2plyr
  • 添加一个方面变量quakes- 在这种情况下,我按地震深度进行总结
  • 用于ddply总结每个深度的平均幅度
  • Use ggplot with geom_text to label the mean magnitude

The code:

library(plyr)
library(ggplot2)

quakes$level <- cut(quakes$depth, 5, 
  labels=c("Very Shallow", "Shallow", "Medium", "Deep", "Very Deep"))

quakes.summary <- ddply(quakes, .(level), summarise, mag=round(mean(mag), 1))

ggplot(quakes, aes(x=long, y=lat)) + 
  geom_point(aes(colour=mag)) + 
  geom_text(aes(label=mag), data=quakes.summary, x=185, y=-35) +
  facet_grid(~level) + 
  coord_map()

enter image description here

于 2012-08-08T07:46:05.013 回答