87-R可视化19-利用其他图层映射自由的控制背景的颜色

2022-02-08 15:22:05 浏览数 (1)

  • Date : [[2022-01-03_Mon]]
  • Tags : #R/index/02 #R/R可视化 #R/R数据科学 #其他/答粉丝问题

前言

最近希望画一幅图:

这不就是带背景的ggplot吗?

解析知识点

有的小朋友可能会说,这不就是个背景吗?在[[57-R可视化6-ggplot2三部曲最终之进阶为菜鸟]] 中我也提到过主题中的panel.background 参数,比如下图:

但是,它并不能让我们满意的生成不同的背景颜色,尤其是,最好可以根据不同的组别,定制这个背景颜色内容。

又是你,多个图层映射

之前我们提到过[[77-R可视化13-多个ggplot图象映射实现以假乱真的dodge stack效果]],这里其实可以利用geom_rect 这个图层。参见:R 数据可视化 —— ggplot 色块图 - 简书 (jianshu.com)[1]

这里需要强调一下rect 的aes 图层需要接受四个参数作为映射,这里我们仅仅通过自己的判断,将数值进行选择:

代码语言:javascript复制
aes(xmin = 4.5, xmax = 9.5,
                ymin = -Inf, ymax = Inf)

不难看出,这种柱状图其实是一个分类数据(x轴)的展示:

因为考虑到geom_rect 图层主要运用在连续数据的展示(比如时间序列曲线):

而如果是分类数据结合连续数据(对不同图层不同data)会导致报错,而如果直接对一个分类数据调整geom_rect 则会非常的怪异。

因此这里我们的假数据实际是一个连续数据:

代码语言:javascript复制
my_data2 <- data.frame(
  counts = runif(10, -1, 10),
  id = 0:9,
  type = rep(c("a","b"), each = 5)
)
代码语言:javascript复制
ggplot()   geom_col(data = my_data2, aes(id, counts), fill = "red") 

调整x 轴标记,以假乱真

主要是之前的[[86-R可视化18-自定义分类或连续数据坐标轴文本]] 中的知识点:

代码语言:javascript复制
scale_x_continuous(breaks=seq(0,9,1), 
                     expand=c(0,0),
    label = paste0("GSE", "00", 0:9))

加上rect 图层

接下来指定多个图层映射,就可以出图了:

代码语言:javascript复制
p1 <- ggplot()   geom_rect(data = my_data2,aes(xmin = -.5, xmax = 4.5,
                          ymin = -Inf, ymax = Inf),fill = "blue", alpha=0.03)   
  geom_rect(data = my_data2, aes(xmin = 4.5, xmax = 9.5,
                ymin = -Inf, ymax = Inf),fill = "red", alpha=0.03)   
  geom_col(data = my_data2, aes(id, counts), fill = "red")   labs(x = NULL)  
  scale_x_continuous(breaks=seq(0,9,1), 
                     expand=c(0,0),
    label = paste0("GSE", "00", 0:9))   
  scale_y_continuous(expand=c(0,0), limits = c(-2,10))   
  theme(axis.text.x = element_text(angle = 90, size = 12))
p1

再加个注释柱子

其实这里有些超纲了,因此仅仅贴上代码,以后再说:

代码语言:javascript复制
p2 <- ggplot(data = my_data2)   geom_tile(aes(id, 1, fill = type), alpha = 0.3)   
  theme(panel.grid = element_blank(), 
        panel.background = element_blank(), axis.line = element_blank(), 
        axis.ticks = element_blank(), axis.text = element_blank(), 
        axis.title = element_blank(),
        legend.position = "none")   scale_fill_manual(values = c("blue", "red"))   
  geom_text(x= 2, y=1, label="normal")   
  geom_text(x = 7, y = 1, label = "tumor")
p2
p1 %>% insert_bottom(p2, height = .1)

参考资料

[1]R 数据可视化 —— ggplot 色块图 - 简书 (jianshu.com): https://www.jianshu.com/p/89cdafdb082a

0 人点赞