尝试使用ggplot2
叠加颜色图(如下所示)
尝试使用geom_tile但ggplot不允许我添加2个色标。这是一个示例代码。
df <- data.frame(expand.grid(1:5,1:5))
df$z1 <- runif(nrow(df))
df$z2 <- runif(nrow(df))
g1 <- ggplot(df,aes(Var1,Var2)) + theme_bw()
#layer 1
g11 <- g1 + geom_tile(aes(fill=z1),alpha=0.5) + scale_fill_gradient(low="white", high="red")
#layer 2
g12 <- g1 + geom_tile(aes(fill=z2),alpha=0.5) + scale_fill_gradient(low="white", high="green")
g11
g12
可能的一种方法是将2个图层设为不同的组。但结果看起来并不直观。
mdf=melt(df,'id'=1:2)
g2 <- ggplot(mdf,aes(Var1,Var2,fill = factor(variable),alpha = value)) +
geom_tile() + scale_fill_manual(values = c('red','green')) + theme_bw()
g2
答案 0 :(得分:3)
你真的很接近:不要将z1和z2除以2.
但还有另一个问题需要考虑。如果z1和z2的比例不同,您是否应该为两者使用通用比例,还是应该单独缩放?结果是(可能)不同,如下所示。
gg.overlay <- function(df) { # produces 2 color channels and the overlay
require(ggplot2)
require(gridExtra)
gg.z1 <- ggplot(df, aes(x,y))+
geom_tile(fill=rgb(red=df$z1.scale,green=0,blue=0))+
scale_x_continuous(expand=c(0,0))+
scale_y_continuous(expand=c(0,0))+
coord_fixed()
gg.z2 <- ggplot(df, aes(x,y))+
geom_tile(fill=rgb(red=0,green=df$z2.scale,blue=0))+
scale_x_continuous(expand=c(0,0))+
scale_y_continuous(expand=c(0,0))+
coord_fixed()
gg <- ggplot(df, aes(x,y))+
geom_tile(fill=rgb(red=df$z1.scale,green=df$z2.scale,blue=0))+
scale_x_continuous(expand=c(0,0))+
scale_y_continuous(expand=c(0,0))+
coord_fixed()
library(gridExtra)
grid.arrange(gg.z1, gg.z2, gg, ncol=3)
}
使用稍微靠近问题中图片的示例:
library(mvtnorm) # just for this example
df <- expand.grid(x=seq(-3,3,len=100),y=seq(-3,3,len=100))
df$z1 <- with(df,dmvnorm(cbind(x,y),mean=c(0,0),sigma=matrix(c(1,-1,-1,2),nc=2)))
df$z2 <- with(df,3*dmvnorm(cbind(x,y),mean=c(0,0),sigma=matrix(c(1,0,0,1),nc=2)))
# scale z1 and z2 together
max.z <- with(df,max(z1,z2))
min.z <- with(df,min(z1,z2))
df$z1.scale <- with(df, (z1-min.z)/(max.z-min.z))
df$z2.scale <- with(df, (z2-min.z)/(max.z-min.z))
gg.overlay(df)
# scale z1 and z2 separately
df$z1.scale <- with(df, (z1-min(z1))/diff(range(z1)))
df$z2.scale <- with(df, (z2-min(z2))/diff(range(z2)))
gg.overlay(df)
在第一种情况下,红色被静音,因为z1
强度低于z2
强度。在第二种情况下,我们将它们分开缩放,因此红色更加生动。目前尚不清楚哪个是正确的&#34;方法
答案 1 :(得分:0)
一种可能的解决方案是手动计算颜色,然后将其传递给geom_tile。 (继续上述代码)
cols=rgb(red=df$z1/2,green=df$z2/2,blue=rep(0,nrow(df)))
g1 <- ggplot(df,aes(Var1,Var2)) + theme_bw() + geom_tile(fill=cols)
g1
如何使颜色变亮?