2014-07-18 2 views
2

두 개의 다른 데이터 프레임 인 P1과 P2가 있습니다. 이러한 각 데이터 프레임에는 N1, N2 및 값 (mean_RMSE)의 세 가지 열이 있습니다. N1과 N2는 15와 120 사이이고 한 라인에서는 N2가 항상 N1보다 낮습니다.geom_tile이있는 플롯의 여러 범례

I 플롯 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에는 빨간색을 사용합니다.

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

: 나는 geom_tile에서 "컬러"를 추가하면

내가 가진 두 개의 서로 다른 윤곽을 juste, P1 및 P2 (난 아직도 그들을 구별 할 수 없습니다)과의 색상을 변경 scale_fill_gradient 사실 P1과 P2에 대한 두 가지 전설이 필요합니다.

나를 도와 줄 사람이 있습니까?

+2

ggplot2로는 가능하지 않다고 생각합니다. 동일한 '기러기'에 대해 두 가지 다른 범례 (및 비늘)를 사용할 수 없습니다. – 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"))) 

이 함수는 범례 grob를 만드는 데 in this post이라는 함수입니다.

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 
} 

지금 모든 것을 함께 넣어 grid.arrange를 사용 후, 다른 색 구성표 2 범례 grobs을 만들려면이 기능을 사용

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