我有一个数据帧,其中一个因变量(y)与自变量x1具有〜对数线性关系,与自变量x2具有〜sigmoidal关系。
df<-data.frame(x1 = rep(c(0:10),11),
x2 = rep(c(0:10), each=11),
logx1 = log(rep(c(0:10),11)+1),
y = 0)
for(i in 1:nrow(df)) df[i,4] = exp(df[i,2]) * (1/(1+exp(-df[i,1])))
我想使用热图显示y对x1和x2变化的变化:
ggplot(df, aes(x=x1, y=x2, fill=y))+
theme_bw()+
scale_fill_distiller(palette = "Spectral")+
geom_tile(size=0.01)
但是很难看出y相对于x1的变化,所以我想在对数刻度上绘制x1:
ggplot(df, aes(x=logx1, y=x2, fill=y))+
theme_bw()+
scale_fill_distiller(palette = "Spectral")+
geom_tile(size=0.01)+
但是它导致数据之间存在大的空间,而不是连续的颜色表面: gaps in heat map
我试过了:
将x1转换为因子并绘图:
df$x1<-factor(df$x1, levels = sort(unique(df$x1)))
使用插值绘制为栅格:
geom_raster(interpolate = TRUE
转换轴本身:
scale_x_continuous(breaks = c(0,1,10)+1, limits = c(0,10)+1, trans = 'log')
使用coord_equal()和coord_fixed(),
更改绘图大小增加数据的分辨率(即,对x1中的每0.001个变化估计y)
但是我无法让空间消失!
我不一定在热图上出售,但我需要显示y对x1和x2的变化,我需要在ggplot中进行
答案 0 :(得分:1)
如果您的示例中有y ~ exp(x)
,那么将y(而不是x)放在日志比例上可能是显示其关系的更好方式。 E.g。
ggplot(df, aes(x=x1, y=x2, fill=log(y))) +
theme_bw() +
scale_fill_distiller(palette = "Spectral") +
geom_tile(size=0.01)
或者,您可以在指数刻度上显示x(请注意,在您的示例中,它实际上是x2与y具有对数线性关系,x1为sigmoidal)。如果要以指数刻度显示x2的连续表面热图,则需要x2的点,这些点在指数刻度上等间隔。获得等间距点的一种方法是pretty()
函数。 E.g。
# generate new data with x2 equally space on exp scale
newdat <- expand.grid(x1 = pretty(df$x1, 10), exp_x2 = pretty(exp(df$x2), 10))
# backtransform exp_x2
newdat$x2 <- log(newdat$exp_x2)
# generate y values (using raw x2 values, not exp_x2)
newdat$y <- exp(newdat$x2) * (1/(1+exp(-newdat$x1)))
# plot
ggplot(newdat, aes(x=x1, y=exp_x2, fill=y)) +
theme_bw() +
scale_fill_distiller(palette = "Spectral") +
geom_tile(size=0.01)