如何制作具有不均匀y轴的热图?

时间:2017-08-31 23:16:53

标签: r plot ggplot2 heatmap

当y轴不均匀时,如何制作热图(或者如果它被称为其他东西)?我也乐于插值,但最好没有它。

当我以偶数间隔绘制图层时,我可以使用此图来获得下图

ggplot(a, aes(x=time, y=Layer, fill = Value))+
  geom_tile()+
  scale_fill_gradient2(low="blue",mid="yellow",high="red", midpoint=0.5)+
  theme_bw()

但是当图层不是1-10个自然数时,我无法继续。

enter image description here

dput(droplevels(head(smx,10)))

structure(list(value = c(5.4023420028113e-07, 5.4023420028113e-07, 
    5.4023420028113e-07, 5.4023420028113e-07, 5.4023420028113e-07, 
    5.4023420028113e-07, 5.4023420028113e-07, 6.74006442227979e-08, 
    6.74006442227979e-08, 6.74006442227979e-08), 
time = structure(c(17156, 17156, 17156, 17156, 17156, 17156, 17156, 17162,     
    17162, 17162), 
class = "Date"), 
layer = c(0.0120349472577243, 0.0177233992991887, 0.00844582491793334,   
    0.00756873916071316, 0.0437965816456147, 0.0168056962032031, 
    0.0181395468747096, 0.0120349472577243, 0.0177233992991887, 
    0.00844582491793334)), 
.Names = c("value", "time", "layer"), 
row.names = c(NA, 10L), 
class = "data.frame")

完整数据在这里

https://pastebin.com/mXUiSyvX

1 个答案:

答案 0 :(得分:1)

您可以使用geom_rect代替geom_tile来指定不同的图块高度。从帮助文件:

  

geom_rect和geom_tile做同样的事情,但是参数化了   不同:geom_rect使用四个角的位置( xmin,    xmax,ymin和ymax ),而geom_tile使用tile的中心和   它的大小(x,y,宽度,高度)。

假设数据框中的图层变量引用每个图块的顶部(即ymax),您可以为每个日期创建一个滞后图层变量,以便在数据框的同一行中获取ymin。根据您的数据集,我还假设最低的图块从ymin = 0开始:

library(dplyr)

ggplot(smx %>%
         group_by(time) %>%
         arrange(layer) %>%
         mutate(layer.min = layer - diff(c(0, layer))) %>% #assuming y axis starts from 0
         ungroup(), aes(fill = value))+
  geom_rect(aes(xmin = time - 0.5, xmax = time + 0.5,
                ymin = layer.min, ymax = layer),
            colour = "black") +
  scale_fill_gradient2(low="blue",mid="yellow",high="red", midpoint = 0.2) +
  scale_x_date(date_breaks = "1 day", date_labels = "%b %d") +
  theme_bw()

ggplot heatmap using geom_rect

(我将瓷砖包含在黑色轮廓中,并在此答案中更改了中点以获得更清晰的视觉区别。请根据实际使用情况随意删除它们。)