带有geom_tile的图中的多个图例

时间:2014-07-18 10:17:48

标签: r ggplot2

我有两个不同的数据框:P1和P2。这些数据帧中的每一个都有3个不同的列:N1,N2和值(mean_RMSE)。 N1和N2在15和120之间,对于线,N2总是低于N1。

如果我绘制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的颜色(我仍然无法区分它们),如果我添加&#34;颜色&#34;在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 个答案:

答案 0 :(得分: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个图例grob,然后使用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 :(得分: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