使用ggplot2绘制双轴分离图

简介

最近科研绘图中,需要解决这么一个需求。如何将下图中的左图(低配版)转化为右图(高配版, x,y 轴分离)。

低配版条形图

首先,构造一个数据集作为样例,读者可以根据自己的数据进行调整即可。假设 y 是分类变量,x 是连续型变量。

df1 <- data.frame(
  term = paste0('term', 1:4),
  p.val = runif(4, 1, 5)
)

样例数据集

之后,使用 geom_col() 绘制条形图,简单调整柱子的宽度以及加上 x,y 轴标题。

ggplot(df1, aes(p.val, term)) +
  geom_col(width = 0.6) +
  labs(x = '-log(BH p value)', 
       y = 'Terms')

低配版条形图

高配版条形图

使用 geom_rangeframe()将 x,y 轴分离。在此之前,创建一个新的数据框,根据你的 x 值,手动划分 x 轴尺度范围。

df2 <- data.frame(x = c(0,2,4,6), y = df1$term)

然后进行一些细节的调整,得到下面的图形。这里的细节调整包括:使用 ggthemes 包中的 theme_tufte() 主题,viridis 包的 scale_fill_viridis() 离散配色。填充的 legend 没有实际含义,所以将图例去除(legend.position = 'none')。

注意:这里将柱子按照类别进行填充,当然你也可以使用另一个变量进行填充(下面会给例子)。

ggplot(df1, aes(p.val, term)) +
  geom_col(aes(fill = term), width = 0.6) +
  geom_rangeframe(data = df2, aes(x = x, y = y), sides = 'bl') +
  scale_fill_viridis(discrete = T)+
  theme_tufte() +
  theme(
    legend.position = 'none',
    panel.grid = element_blank(),
    axis.text = element_text(size = rel(1.1))
  ) +
  labs(x = '-log(BH p value)', 
       y = 'Terms')

高配版条形图

进阶版条形图

如前面所说,如果读者还想表达另一个变量与这两个变量之间的关系。可以在柱子的填充上加上做文章。假设第三变量为各个 Term 的得分系数 score(连续型变量)。那么对上面的代码进行简单调整,即可得到以下图形。

主要细节调整: geom_col() 中的 aes(fill = score),连续性变量填充使用 scale_fill_gradient2() 以及加上了图例。

df1 <- data.frame(
  term = paste0('term', 1:8),
  p.val = runif(8, 1, 5),
  score = rnorm(8, 0, 1)
)
df2 <- data.frame(x = c(0:6,6), y = df1$term)

ggplot(df1, aes(p.val, term)) +
  geom_col(aes(fill = score), width = 0.6) +
  geom_rangeframe(data = df2, aes(x = x, y = y), sides = 'bl') +
  scale_fill_gradient2(
    low = 'cyan',
    mid = '#fbffff',
    high = 'chocolate1',
    midpoint = 0)+
  theme_tufte() +
  theme(
    legend.position = c(0.9,0.75),
    panel.grid = element_blank(),
    axis.text = element_text(size = rel(1.1))
  ) +
  labs(x = '-log(BH p value)', 
       y = 'Terms')

进阶版条形图

小编有话说

  • 本推文最主要知识点:使用 geom_rangeframe()并配合 ggthemes 包中的 theme_tufte()主题,得到 x,y 轴分离的图形。
  • 推文以条形图作为例子进行详细讲解(试图教会你们😄)。当然这种技巧也可以使用其他图形中。读者如有需求,可以自行探索。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值