R语言如何双向柱形图

什么是双向柱形图

双向柱状图(又名正负条形图),使用正向和反向的柱子显示类别之间的数值比较。其中分类轴表示需要对比的分类维度,连续轴代表相应的数值。其实就是由两个不同数据系列的柱形图组成的。

例如,在组学数据分析中,双向柱形图可以很直观的看到,上下调蛋白,注释到该通路下的数量。

当然双向柱形图的作用不止如此,下面让我们一起来看看双向柱形图该怎么画吧。

绘图前的数据准备

​demo数据可以在https://www.r2omics.cn/res/demodata/bar2.txt下载。

包含3列数据,第一列为每个柱子的名字,第二列为第一个方向上的数值,第三列为第二个方向上的数值。

R语言如何绘制双向柱形图

# 代码来源:https://www.r2omics.cn/
# 加载R包,没有安装请先安装  install.packages("包名") 
library(tidyverse)

# 读取双向柱形图数据文件
df= read.delim("https://www.r2omics.cn/res/demodata/bar2.txt") # 这里读取了网络上的demo数据,将此处换成你自己电脑里的文件

# 转为为绘图所需要的长数据
df = df %>%
  pivot_longer(-1,names_to = "Sample",values_to = "Value")

# 绘图
ggplot(df, aes(
  y = factor(X,levels = unique(X)),             # 将第一列转化为因子,目的是显示顺序与文件顺序相同,否则按照字母顺序排序
  x = ifelse(Sample == "Up", Value, -Value),    # 判断分组情况,将两个柱子画在0的两侧
  fill = Sample)) +
  geom_bar(stat = 'identity')+                      # 画柱形图
  geom_text(                                        # 在图形上加上数字标签
    aes(label=Value,                                # 标签的值(数据框的第三列)
        hjust = ifelse(Sample == "Up", -0.4, 1.1)   # 水平位置
    ),
    size=2                                          # 标签大小
  )+
  labs(                                             # 设置坐标值标签
    x="",
    y="",
    fill=""
  )+
  theme_bw()+
  scale_x_continuous(                               # 调整y轴
    labels = abs,                                   # 刻度设置为绝对值
    expand = expansion(mult = c(0.1, 0.1)))         # 在y轴的两侧,留下一部分的空白位置,防止加标签的时候,显示不全