2012-08-08 84 views
4

這裏我是一個完全R初學者,這個問題的複雜程度相應的水平。將來自多個數據幀的內容繪製到單個ggplot2表面

我在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([email protected][[1]],[email protected][[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的內置faceting功能時,我仍然能夠輸出一個自定義字符串(AUC分數)到它將生成的每個繪圖。

+1

答案是要通過你的文件涉及'lapply'循環,然後'do.call(rbind,...)'將數據幀合併成單個數據幀。正如你所說,這個單一的數據框應該包含一個標識facet變量的列。然後這是一個調用'ggplot',你就完成了。 – Andrie 2012-08-08 07:07:49

+0

謝謝安德烈。這似乎是獲得多曲線圖的一個很好的基本方法,但是(根據上面的編輯),我不確定如何去定製每個單獨的曲線圖並用一個字符串來渲染它。我看不出如何將單個字符串與包含每個圖的數據的數據框的一部分相關聯,以及如何告訴ggplot2在哪裏找到該字符串以及如何處理它。 – Inverseofverse 2012-08-08 07:12:21

+0

如果你製作一個小的[可重現的例子](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)來演示你的問題,我會看看。製作一個樣本數據框架,用一個方面創建一個'ggplot',並且在你的'geom_text'中指出你想要的數據。 – Andrie 2012-08-08 07:17:56

回答

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

+2

感謝您提供一個全面的例子!我從中學到了很多有趣的東西:ddply()的正確應用,爲geom_text提供了一個數據引用等等。我的項目結果非常不同,但我能夠使它工作 - 更重要的是, ,通過拉開示例代碼來理解它爲什麼起作用。欣賞它。 – Inverseofverse 2012-08-09 05:54:06

+1

這麼多...來處理這個答案。感謝您的簡潔明智的答覆。 – KarateSnowMachine 2012-08-09 15:50:38

相關問題