gpt4 book ai didi

r - 使用 2 个色阶 ggplot2 叠加颜色图

转载 作者:行者123 更新时间:2023-12-04 10:08:52 29 4
gpt4 key购买 nike

尝试使用 ggplot2 叠加颜色图(如下所示)

Red + Green giving Yellow in the 3rd column

尝试使用 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

best outcome i could come up with

最佳答案

你真的很接近:只是不要将 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强度。在第二种情况下,我们分别缩放它们,因此红色更加鲜艳。目前尚不清楚哪个是“正确”的方法。

关于r - 使用 2 个色阶 ggplot2 叠加颜色图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27738646/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com