2014-07-18 18 views
2

我有兩個不同的數據框架:P1和P2。每個數據幀都有3個不同的列:N1,N2和一個值(mean_RMSE)。 N1和N2在15到120之間,對於一條線,N2總是低於N1。與geom_tile的陰謀中的多個圖例

如果我的情節P1,這是我得到:

p <- ggplot() 
p <- (p 
     + geom_tile(data=P1, aes(x=as.numeric(N1), y=as.numeric(N2), fill=mean_RMSE)) 
) 

P1

但我的目標是繪製P1和P2在同一個情節:

p <- ggplot() 
p <- (p 
     + geom_tile(data=P1, aes(x=as.numeric(N1), y=as.numeric(N2), fill=mean_RMSE)) 
     + geom_tile(data=P2, aes(x=as.numeric(N2), y=as.numeric(N1), fill=mean_RMSE)) 
) 

P1_P2

我不知道如何改變P2的顏色。例如,我想要P1的藍色範圍和P2的紅色範圍,以便輕鬆區分P1和P2。

scale_fill_gradient改變P1和P2(我仍然無法區分它們)和顏色,如果我在geom_tile添加 「色彩」,我探微有兩個不同的輪廓:

p <- ggplot() 
p <- (p 
     + geom_tile(data=psSST_T[[1]], aes(x=as.numeric(N1), y=as.numeric(N2), fill=mean_RMSE, colour="red")) 
     + geom_tile(data=psT_SST[[1]], aes(x=as.numeric(N2), y=as.numeric(N1), fill=mean_RMSE, colour="blue"))) 

contour

事實上,我想要P1和P2有兩個不同的傳說。

有人可以幫助我嗎?

+2

我不認爲這是可能的ggplot2。對於同一個'geom',你不能有兩個不同的圖例(和比例)。 – juba

回答

9

我假設你想爲P1和P2數據幀使用不同的配色方案。您可以通過組合fill=factor(data_frame)alpha=mean_RMSE來實現此目的。然後 你可以使用gridExtra和gtable包添加2個圖例。

# making up data 
P1 <- data.frame(N1=as.integer(runif(100, 0, 12))*10, 
       N2=as.integer(runif(100, 0, 12))*10, 
       mean_RMSE=rnorm(100, 0, 1), 
       data_frame=rep("P1", 100)) 
P2 <- data.frame(N1=as.integer(runif(100, 0, 12))*10, 
       N2=as.integer(runif(100, 0, 12))*10, 
       mean_RMSE=rnorm(100, 0, 1), 
       data_frame=rep("P2", 100)) 
d <- rbind(P1, P2) 

library(ggplot2) 
library(gridExtra) 
library(gtable) 

(g_main <- ggplot(d, aes(N1, N2, fill=data_frame, alpha=mean_RMSE)) + geom_tile() + 
      scale_fill_manual("", values = c("#CC0000", "#0000FF"), drop = FALSE)) 

## create dummy plots to create legends of 2 different color schemes 

(g_dummy1 <- ggplot(subset(d, data_frame=="P1"), aes(N1, N2, fill=mean_RMSE)) + geom_tile() + 
      scale_fill_gradientn(name = "Mean RMSE \n(P1)", colours=c("#CC0000", "white"))) 
(g_dummy2 <- ggplot(subset(d, data_frame=="P2"), aes(N1, N2, fill=mean_RMSE)) + geom_tile() + 
      scale_fill_gradientn(name = "Mean RMSE \n(P2)", colours=c("#0000FF", "white"))) 

這是一個功能找到in this post來創建一個圖例grob。

g_legend<-function(a.gplot){ 
    tmp <- ggplot_gtable(ggplot_build(a.gplot)) 
    leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box") 
    legend <- tmp$grobs[[leg]] 
    legend 
} 

現在使用此功能來創建2個不同的配色方案傳說grobs,然後用grid.arrange把一切融合在一起:

legend1 <- g_legend(g_dummy1) 
legend2 <- g_legend(g_dummy2) 
grid.arrange(g_main+theme(legend.position = 'none'), legend1, legend2, 
      ncol=3, widths=c(4/6, 1/6, 1/6)) 

enter image description here

1

這是美麗和輝煌。我可能對傳說中發生的事情一無所知,但似乎在主圖中,藍色和紅色使用相同的亮度等級進行繪製,但在傳說來自強度等級的子圖上僅來自繪製數據。如果是這種情況,那麼這個傳說就有點過時了。如果我是正確的,那麼我認爲這可以通過增加限制次要情節是固定的:

(g_dummy1 <- ggplot(subset(d, data_frame=="P1"), aes(N1, N2, fill=mean_RMSE)) + geom_tile() 
+ scale_fill_gradientn(name = "Mean RMSE \n(P1)", colours=c("#CC0000", "white"), 
limits = c(min(d$mean_RMSE), max(d$mean_RMSE)))) 

(g_dummy2 <- ggplot(subset(d, data_frame=="P2"), aes(N1, N2, fill=mean_RMSE)) + geom_tile() 
+ scale_fill_gradientn(name = "Mean RMSE \n(P2)", colours=c("#0000FF", "white"), 
limits = c(min(d$mean_RMSE), max(d$mean_RMSE)))) 

其中給出這樣的:

enter image description here

請告訴我,如果你不同意。感謝發佈這個很棒!

-Dustin

+0

請注意'c(min(d $ mean_RMSE),max(d $ mean_RMSE))'與'range(d $ mean_RMSE)'相同。另外,我認爲其他答案中的傳說是正確的,即他們使用不同的尺度(但你的補充將解決這個問題)。 – Axeman