查看原文
其他

R 绘制柱形偏差图

JunJunLab 老俊俊的生信笔记 2022-08-15

点击上方关注我们




前几天有小伙伴在 老俊俊生信交流群 里发了一个柱形图,询问怎么绘制,于是今天分享一下绘制代码给大家,下面是小伙伴发的图:

这幅图绘制的关键点有两个:

  • 1、排序
  • 2、在图里添加文本标签,并为不同颜色

数据的话大家根据类似格式整理成就可以了。

首先加载 R 包,读取测试数据:

# 加载R包
library(ggplot2)
library(ggprism)
library(tidyverse)

# 读取数据
bar <- read.table('C:/Users/admin/Desktop/bar.txt',header = T)
# 查看数据
head(bar,3)
       id         B type
1 THYROID -1.821506  low
2  IMMUNE -1.652449  low
3    ACID -1.430220  low

接下来我们给数据排序,然后设置 因子类型的水平 就能按照排序的数值大小进行显示了:

# 升序排序
bar <- bar %>% arrange(B)
# 变成因子类型
bar$id <- factor(bar$id,levels = bar$id)

先默认画一张:

ggplot(data = bar,aes(x = id,y = B,fill = type)) +
  geom_col() +
  xlab('') + ylab('') +
  # 主题
  theme_prism(border = T)

emmm。。。,还差点味道,主要需要修改的有:1、去掉横坐标标签 2、坐标轴翻转 3、在图里添加文本 4、调颜色 5、添加虚线

开始优化:

# 绘图
p <- ggplot(data = bar,aes(x = id,y = B,fill = type)) +
  geom_col() +
  xlab('') + ylab('') +
  # 主题
  theme_prism(border = T) +
  # 填充颜色
  scale_fill_manual(values = c('high''#035397','none'='grey','low'='#4AA96C')) +
  # 竖线
  geom_hline(yintercept = c(-1,1),color = 'white',size = 1,lty='dashed') +
  # 翻转坐标轴
  coord_flip() + ylim(-2.5,2.5) +
  # 去除坐标轴标签
  theme(axis.text.y = element_blank(),
        axis.ticks.y = element_blank(),
        # 移动图例位置
        legend.position = c(0.1,0.9))
p

然后添加文本标签,这里我们用到 geom_text 函数,分四次添加,注意我们排序是 从小到大排序 的,所以为 添加文本标签也从下到上添加

# 添加标签在图里

# 小于-1的数量
low1 <- bar %>% filter(B < -1) %>% nrow()
# 小于0总数量
low0 <- bar %>% filter( B < 0) %>% nrow()
# 小于1总数量
high0 <- bar %>% filter(B < 1) %>% nrow()
# 总的柱子数量
high1 <- nrow(bar)

# 依次从下到上添加标签
p + geom_text(data = bar[1:low1,],aes(x = id,y = 0.1,label = id),
              hjust = 0,color = 'black') + # 小于-1的为黑色标签
   geom_text(data = bar[(low1 +1):low0,],aes(x = id,y = 0.1,label = id),
            hjust = 0,color = 'grey') + # 灰色标签
   geom_text(data = bar[(low0 + 1):high0,],aes(x = id,y = -0.1,label = id),
            hjust = 1,color = 'grey') + # 灰色标签
   geom_text(data = bar[(high0 +1):high1,],aes(x = id,y = -0.1,label = id),
            hjust = 1,color = 'black'# 大于1的为黑色标签

这张图就完美复现了,大家只要改变一下输入数据,后面代码全部直接运行即可,是不是非常的方便。

我们还可以把颜色映射给 B,得到颜色渐变的柱子:

# 绘图
p <- ggplot(data = bar,aes(x = id,y = B,fill = B)) +
  geom_col() +
  xlab('') + ylab('') +
  # 主题
  theme_prism(border = T) +
  # 填充颜色
  # scale_fill_manual(values = c('high'= '#035397','none'='grey','low'='#4AA96C')) +
  scale_fill_gradient2(low = '#FFC074',mid = '#B6C867',high = '#01937C') +
  # 竖线
  geom_hline(yintercept = c(-1,1),color = 'white',size = 1,lty='dashed') +
  # 翻转坐标轴
  coord_flip() + ylim(-2.5,2.5) +
  # 去除坐标轴标签
  theme(axis.text.y = element_blank(),
        axis.ticks.y = element_blank(),
        # 移动图例位置
        legend.position = c(0.1,0.9))

# 添加标签在图里

# 小于-1的数量
low1 <- bar %>% filter(B < -1) %>% nrow()
# 小于0总数量
low0 <- bar %>% filter( B < 0) %>% nrow()
# 小于1总数量
high0 <- bar %>% filter(B < 1) %>% nrow()
# 总的柱子数量
high1 <- nrow(bar)

# 依次从下到上添加标签
p + geom_text(data = bar[1:low1,],aes(x = id,y = 0.1,label = id),
              hjust = 0,color = 'black') + # 小于-1的为黑色标签
   geom_text(data = bar[(low1 +1):low0,],aes(x = id,y = 0.1,label = id),
            hjust = 0,color = 'grey') + # 灰色标签
   geom_text(data = bar[(low0 + 1):high0,],aes(x = id,y = -0.1,label = id),
            hjust = 1,color = 'grey') + # 灰色标签
   geom_text(data = bar[(high0 +1):high1,],aes(x = id,y = -0.1,label = id),
            hjust = 1,color = 'black'# 大于1的为黑色标签

想要测试数据的可以公众号私信我哈!



END




所以今天你学习了吗?



发现更多精彩

关注公众号

欢迎小伙伴留言评论!

今天的分享就到这里了,敬请期待下一篇!

最后欢迎大家分享转发,您的点赞是对我的鼓励肯定

如果觉得对您帮助很大,赏杯快乐水喝喝吧!

推 荐 阅 读




您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存