文末送书|如何使用 ggplot2 绘制双轴分离图?

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

简介


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

TP1@%O($V_LQ3YQ6948J81E.png


低配版条形图

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

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

JSOF(YSVS$X5D[_{{F5HG2C.png

image.gif样例数据集

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

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

image.gif4C(YL6FB6R8`(U)28$@5I)4.png

低配版条形图


高配版条形图

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

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

_%6X4_HRQ]KQJ5BAWJN625M.png

然后进行一些细节的调整,得到下面的图形。这里的细节调整包括:使用 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')

image.gifFF]1$(EJ2B27R%T]A%S8V(A.png

高配版条形图


进阶版条形图

如前面所说,如果读者还想表达另一个变量与这两个变量之间的关系。可以在柱子的填充上加上做文章。假设第三变量为各个 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')

NL}_D6SZF7JKR92E4K3FUIN.png

目录
相关文章
|
人工智能 数据可视化 Go
R绘图实战|GSEA富集分析图
GSEA(Gene Set EnrichmentAnalysis),即基因集富集分析,它的基本思想是使用预定义的基因,将基因按照在两类样本中的差异表达程度排序,然后检验预先设定的基因集合是否在这个排序表的顶端或者底端富集。
2531 0
R绘图实战|GSEA富集分析图
|
11天前
|
数据可视化 测试技术 uml
如果更好的绘制UML图
如果更好的绘制UML图
11 0
|
1月前
|
Python
matplotlib绘制动态瀑布图
matplotlib绘制动态瀑布图
|
10月前
|
Go
如何用ggplot2绘制基因功能富集气泡图?
如何用ggplot2绘制基因功能富集气泡图?
|
10月前
|
存储 Go
速绘丨GO富集气泡图绘制方法,利用R语言ggplot2包快速绘制,完整脚本可重复绘图
速绘丨GO富集气泡图绘制方法,利用R语言ggplot2包快速绘制,完整脚本可重复绘图
|
数据可视化 数据挖掘 Python
答读者问:关于R语言ggplot2做花瓣图的几个问题
答读者问:关于R语言ggplot2做花瓣图的几个问题
|
人工智能 数据可视化
如何一步步提高图形 B 格?以 ggplot 绘图为例
如何一步步提高图形 B 格?以 ggplot 绘图为例
107 0
|
数据处理 图形学
ggplot 分面的细节调整汇总
ggplot 分面的细节调整汇总
164 0
|
数据可视化
Qt开发技术:Q3D图表开发笔记(一):Q3DScatter三维散点图介绍、Demo以及代码详解
qt提供了q3d进行三维开发,虽然这个框架没有得到大量运用也不是那么成功,性能上也有很大的欠缺,但是普通的点到为止的应用展示还是可以的。
Qt开发技术:Q3D图表开发笔记(一):Q3DScatter三维散点图介绍、Demo以及代码详解
|
数据可视化
Qt开发技术:Q3D图表开发笔记(三):Q3DSurface三维曲面图介绍、Demo以及代码详解
qt提供了q3d进行三维开发,虽然这个框架没有得到大量运用也不是那么成功,性能上也有很大的欠缺,但是普通的点到为止的应用展示还是可以的。其中就包括华丽绚烂的三维图表,数据量不大的时候是可以使用的。前面介绍了基础的q3d散点图、柱状图,本篇介绍基础的三维曲面图。Q3DSurface类提供了渲染3D曲面图的方法。该类使开发人员能够渲染3D表面图,并通过自由旋转场景来查看它们。可以通过QSurface3DSeries控制曲面的视觉财产,例如绘制模式和着色。