带有一个对数轴的热图

时间:2016-07-14 19:41:34

标签: r ggplot2 heatmap

我有一个数据帧,其中一个因变量(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中进行

1 个答案:

答案 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)

heatmap 1 或者,您可以在指数刻度上显示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)

heatmap 2