将多个数据帧中的内容绘制到单个ggplot2表面中

时间:2012-08-08 07:00:34

标签: r ggplot2

我在这里是一名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分数)输出到它将生成的每个绘图中。

1 个答案:

答案 0 :(得分:13)

以下是如您所述生成绘图的示例。我使用内置数据集quakes

代码执行以下操作:

  • 加载ggplot2plyr个套件
  • 将一个方面变量添加到quakes - 在这种情况下,我按地震深度进行总结
  • 使用ddply汇总每个深度的平均幅度
  • 使用ggplotgeom_text标记平均幅度

代码:

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