简介
最近科研绘图中,需要解决这么一个需求。如何将下图中的左图(低配版)转化为右图(高配版, 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')