专栏首页实验盒R画图y轴范围太大时,如何局部压缩坐标轴?

R画图y轴范围太大时,如何局部压缩坐标轴?

用 R 画图的时候,如果 y 轴存在个别非常大或非常小的值,或者当中的数值存在非常大差异的时候,画出的图很容易产生误导效果,使人忽略当中某一部分信息。

比如,下面这张 GWAS 曼哈顿图中(来自https://doi.org/10.1371/journal.pgen.1006594.g001),y 轴的值是由每一个 SNP 进行关联分析算出的 p 值再进行 -log10(P) 转换后得到的。图中存在非常多显著的 SNPs,当中最显著的 -log10(P) 甚至达到了 150 左右。不过,这样画图的话,红线附近会有很多显著的 SNPs 会因为 y 轴太大而显得不怎么显著。

针对这种 y 轴范围太大、有一部分点与其他点差距非常大的情况,可以考虑压缩/压扁 y 轴。删除 y 轴中没有点的部分也是可以,但个人更倾向于直接对 y 轴进行缩放,把偏离比较大的区域压扁。

RPub 上有一篇文章介绍了一个缩放的函数(https://rpubs.com/huanfaChen/squash_remove_y_axix_ggplot) ,但当中有个小问题。这里小修改了一下。

首先生成一个示例数据,直接用 ggplot2 画图:

library(ggplot2)

shiyanhe <- data.frame(group=rep(c('A', 'B', 'C', 'D'), each = 10), 
                 value=c(rnorm(10), rnorm(10)+100))
 
ggplot(shiyanhe, aes(x=group, y=value)) + geom_point()

得到的图是这样的,不同组别的值差别非常大,y 轴范围很大:

接下来构建一个 squash_axis 函数来实现坐标轴压缩功能,这个函数需要使用 scales 包:

library(scales)

squash_axis <- function(from, to, factor) { 
    # Args:
    #   from: left end of the axis
    #   to: right end of the axis
    #   factor: the compression factor of the range [from, to]

  trans <- function(x) {    
      # get indices for the relevant regions
      isq <- x > from & x < to
      ito <- x >= to

      # apply transformation
      x[isq] <- from + (x[isq] - from)/factor
      x[ito] <- from + (to - from)/factor + (x[ito] - to)

      return(x)
  }

  inv <- function(x) {
      # get indices for the relevant regions
      isq <- x > from & x < from + (to - from)/factor
      ito <- x >= from + (to - from)/factor

      # apply transformation
      x[isq] <- from + (x[isq] - from) * factor
      x[ito] <- to + (x[ito] - (from + (to - from)/factor))

      return(x)
  }

# return the transformation
  return(trans_new("squash_axis", trans, inv))
}

然后就可以在 ggplot 画图时的 coord_trans 使用这个函数。参数 from 和 to 是要压缩的范围, factor 是要压缩的倍率。比如要把 5 到 95 范围的 y 轴压缩 10倍:

ggplot(shiyanhe, aes(x = group, y = value))+
  geom_point()+
  coord_trans(y = squash_axis(5, 95, 10))

这样画出的图,就能看清每个组别中各个点的分布:

把 1 到 99 范围的 y 轴压缩 30 倍:

ggplot(shiyanhe,aes(x = group, y = value))+
  geom_point()+
  coord_trans(y = squash_axis(1, 99, 30))

备注

注意,参考的 Rpub 原文使用 scale_y_continuous()进行转换:

ggplot(shiyanhe, aes(x = group, y = value))+
  geom_point()+
  scale_y_continuous(trans = squash_axis(5, 95, 10))

然而这样操作会报错:

ERROR while rich displaying an object: Error in x[isq] <- from + (x[isq] - from) * factor: NAs are not allowed in subscripted assignments

使用 coord_trans 的话,就可以画出图。

参考

  1. https://rpubs.com/huanfaChen/squash_remove_y_axix_ggplot
  2. https://stackoverflow.com/questions/61010786/error-nas-are-not-allowed-in-subscripted-assignments-while-using-squash-axis-i

本文分享自微信公众号 - 实验盒(gh_8a85afc0b064),作者:实验盒

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-03-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • matplotlib绘图技巧详解(三)

    我们之前已经讲述了matplotlib的绘图原理,陆续会更新绘图技巧、相关图形绘制。

    朱小五
  • R语言绘图001-基础参数

    ann:如果ann=FALSE,那么高水平绘图函数会调用函数plot.default使对坐标轴名称、整体图像名称不做任何注解。默认值为TRUE。

    西游东行
  • 数据可视化 | 手撕 Matplotlib 绘图原理(一)

    本文内容适合入门及复习阅读,绘图所需的基本知识均有涉及,内容较多,由于篇幅限制,故分成两部分。

    数据STUDIO
  • Matplotlib新手上路(上)

    matplotlib是python里用于绘图的专用包,功能十分强大。下面介绍一些最基本的用法: 一、最基本的划线 先来一个简单的示例,代码如下,已经加了注释: ...

    菩提树下的杨过
  • 5-3 绘制图形

    基本形状的绘制,我们可以从图形类提供的方法中找到解决方案,比如三角形即画三条相互连接的直线,心形则依次画几个半圆形组合,关键问题是找准其中的连接点位置,常见图形...

    py3study
  • R语言系列第六期:③R语言高级绘图(上)

    这一节将介绍更多的R图形资源。首先是定制R图形的一些常用方法,主要涉及数据和模型的图形绘制。然后是如何自定义其他类型的图形或点线等元素。

    百味科研芝士
  • ggplot2包图形参数(坐标轴、分面、配色)整理

    R具有强大的统计计算功能和便捷的数据可视化系统。目前R主要支持四套图形系统:基础图形(base)、网格图形(grid)、lattice图形和ggplot2。其中...

    DataCharm
  • Matplotlib 系列之「绘制函数图像」

    matplotlib 是 python 最著名的绘图库,它提供了一整套和 matlab 相似的命令 API,十分适合交互式进行绘图。

    Python技术与生活认知的分享
  • Android开发笔记(一百五十四)OpenGL的画笔工具GL10

    上一篇文章介绍了OpenGL绘制三维图形的流程,其实没有传说中的那么玄乎,只要放平常心把它当作一个普通控件就好了,接下来继续介...

    用户4464237
  • 不到30行代码实现一个酷炫H5全景

    前言:本文将围绕:了解什么是全景 --> 怎么构成全景 --> 全景交互原理来进行讲解,手把手教你从零基础实现一个酷炫的Web全景,并讲解其中的原理。小白也能学...

    coder_koala
  • Matlab系列之二维图形(上)

    上一篇已经对图形的属性有过介绍,在此基础上来进行二维以及后续三维图形的操作(注:没接触过其他维度的操作,就不折腾相关的内容了),将会更容易理解这些属性的用法,当...

    狂人V
  • 如何用matlab画稍微美观点的图

    本科毕设论文写作过程中,老师指出我用matlab画的图太丑,需要好好改改。于是我这几天参考网上资料,对画图的一些细节进行了设置,得到的图确实比以前好了些。而且我...

    王云峰
  • WebGL简易教程(五):图形变换(模型、视图、投影变换)

    通过之前的教程,对WebGL中可编程渲染管线的流程有了一定的认识。但是只有前面的知识还不足以绘制真正的三维场景,可以发现之前我们绘制的点、三角形的坐标都是[-1...

    charlee44
  • 盘一盘 Python 系列 7 - PyEcharts (v1.0)

    有读者说〖PyEcharts〗一贴里的图美如画,但是版本是 pyecharts v0.5,用现在 v1.0 来运行会出错,建议我再写篇 pyecharts v1...

    用户5753894
  • 盘一盘 Python - PyEcharts (v1.0)

    有读者说〖PyEcharts〗一贴里的图美如画,但是版本是 pyecharts v0.5,用现在 v1.0 来运行会出错,建议我再写篇 pyecharts v1...

    石晓文
  • Matlab入门到放弃(三)、matlab基础知识

    2、在进行矩阵之间的运算时,假设a,b表示两个矩阵,a*b表示矩阵a与矩阵b进行矩阵相乘,a.*b表示矩阵a中的元素与矩阵b中的元素按位置依次相乘,得到的结果作...

    根究FPGA
  • OpenGL Shader实例分析(8)彩色光圈效果

    本文实例为大家分享了OpenGL实现彩色光圈效果的具体代码,供大家参考,具体内容如下

    砸漏
  • 深度学习基础之matplotlib,一文搞定各个示例

    Matplotlib 是 Python 的绘图库。它可与 NumPy 一起使用 ,Matplotlib也是深度学习的常用绘图库,主要是将训练的成果进行图形化,...

    香菜聊游戏
  • 一起来学matlab-matlab学习笔记8 基本绘图命令_5 初级二维绘图/交互式绘图

    本文为matlab自学笔记的一部分,之所以学习matlab是因为其真的是人工智能无论是神经网络还是智能计算中日常使用的,非常重要的软件。也许最近其带来的一...

    演化计算与人工智能

扫码关注云+社区

领取腾讯云代金券