我有两个不同的数据框: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和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))
)
我不知道如何更改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")))
事实上,我想要P1和P2的两个不同的传说。
有人可以帮助我吗?
答案 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))
答案 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))))
这给出了这个:
如果你不同意,请告诉我。感谢发布这个很棒!
-Dustin