• ggplot2画各种误差线和森林图


    获取更多R语言知识,请关注公众号:医学和生信笔记

    医学和生信笔记,专注R语言在临床医学中的使用,R语言数据分析和可视化。主要分享R语言做医学统计学、meta分析、网络药理学、临床预测模型、机器学习、生物信息学等。


    森林图最重要的内容之一就是误差线,前面介绍过多种森林图的画法了,今天学习下误差线的各种画法,基于 ggplot2

    当然也并不是只有森林图中才用误差线,很多图中都用,所以这个方法也是通用的,只要你觉得差不多的误差线,都可以用!

    编一个数据

    先编造一个数据。数据结构是通用的,既然要画误差线,那肯定得提供最大值和最小值,还要提供均值(或者其他的,肯定是介于最大值和最小值之间的)。

    还有一列group,纯粹是为了给误差线上色用的。如果你提供的是离散型变量,那就提供离散型颜色,如果是数值型变量,就提供连续型颜色。

    library(tibble)
    options(digits = 2)
    df <- tibble(
      label = LETTERS[1:22],
      mean = rnorm(22,mean = 1, sd=0.2),
      lower = mean - 0.1,
      upper = mean + 0.2,
      group = c(rep("Group-1",7),rep("Group-2",7),rep("Group-3",8))
    )
    df
    
    # A tibble: 22 x 5
       label  mean lower upper group  
       <chr> <dbl> <dbl> <dbl> <chr>  
     1 A     1.03  0.928 1.23  Group-1
     2 B     0.741 0.641 0.941 Group-1
     3 C     0.691 0.591 0.891 Group-1
     4 D     0.715 0.615 0.915 Group-1
     5 E     1.06  0.959 1.26  Group-1
     6 F     0.962 0.862 1.16  Group-1
     7 G     0.966 0.866 1.17  Group-1
     8 H     0.775 0.675 0.975 Group-2
     9 I     1.22  1.12  1.42  Group-2
    10 J     0.819 0.719 1.02  Group-2
    # ... with 12 more rows
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    加载R包

    library(ggplot2)
    
    • 1

    提供一个基本图:

    p <- ggplot(data = df,aes(color = group))
    
    • 1

    geom_errorbarh()和geom_errorbar()

    这两个函数是一样的用法,都是用来画误差线的,看名字就知道只有一点点小小的差别!

    h不就代表horizontal吗,水平的,横着的!

    • geom_errorbar():默认是画竖直方向的误差线,比如在条形图上面添加误差线这种画法,需要提供x,yminymax,确定误差线上下两个端点的位置;
    • geom_errorbarh():默认是画水平方向的误差线,需要提供y,xminxmax`,确定误差线左右两个端点的位置。

    先看看geom_errorbar()的常规用法

    既然是竖直方向的误差线,那么我们就要提供横坐标x,确定这条误差线的位置,还要提供上下两个端点的位置:ymin,ymax。

    p + geom_point(aes(x = label, y = mean),size=5)+
      geom_errorbar(aes(x = label,ymin = lower, ymax = upper),
                    width = 0.6, # 控制上下两条短横线的长短
                    size = 2 # 控制线条整体粗细
                    )+
      theme_bw()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    202204150001

    再看看geom_errorbarh()的常规用法

    用来画水平方向的误差线,那么需要提供纵坐标y,左右两个端点的坐标:xmin和xmam。

    注意控制两边端点处短线长短的参数,一个是width,一个是height!

    p + geom_point(aes(x=mean, y=label))+
      geom_errorbarh(aes(y=label,xmin=lower, xmax=upper),
                     height=0.5, # 控制左右端点两条小竖线的长短
                     size=1)+
      theme_bw()
    
    • 1
    • 2
    • 3
    • 4
    • 5

    202204150002

    为什么说是常规情况呢?

    因为某些情况下,其实两个函数可以混用,不管是竖直的和水平的,只要你提供的参数正确,都可以画出来,比如上面那段代码,你把geom_errorbarh换成geom_errorbar也是能够运行的。

    geom_pointrange()和geom_linerange()

    你可能也见过两端没有短线的误差线或者森林图。其实非常简单,直接把端点两端的线的长度变成0不就行了吗?

    p + geom_point(aes(x=mean, y=label))+
      geom_errorbarh(aes(y=label,xmin=lower, xmax=upper),
                     height=0, # 控制左右端点两条小竖线的长短
                     size=1)+
      theme_bw()
    
    • 1
    • 2
    • 3
    • 4
    • 5

    202204150003

    果然是十分完美的!

    但既然是ggplot2系列,那必须优雅!直接给你提供一个geom_pointrange()函数。

    p+geom_pointrange(aes(x=mean,y=label,xmin=lower,xmax=upper),
                      size=1, # 控制线的宽度
                      fatten = 0.6 # 控制点的大小
                      )
    
    • 1
    • 2
    • 3
    • 4

    202204150004

    那竖直方向的怎么画?是不是还有一个geom_pointrangeh()函数?

    不好意思,还真没有。你至少可以通过2种方法实现。

    首先是翻转:

    p+geom_pointrange(aes(x=mean,y=label,xmin=lower,xmax=upper),
                      size=1, # 控制线的宽度
                      fatten = 0.6 # 控制点的大小
                      )+
      coord_flip()
    
    • 1
    • 2
    • 3
    • 4
    • 5

    202204150005

    或者在映射横纵坐标时换一下:

    p+geom_pointrange(aes(x=label,y=mean,ymin=lower,ymax=upper),
                      size=1, # 控制线的宽度
                      fatten = 0.6 # 控制点的大小
                      )
    
    • 1
    • 2
    • 3
    • 4

    202204150005

    怎么样,是不是非常简单?

    那么还有一个geom_linerange()函数,顾名思义,只有线,没有点!其实你可以通过给geom_pointrange()函数设置为点的大小为0实现这种效果。

    p+geom_linerange(aes(x=label,y=mean,ymin=lower,ymax=upper),
                      size=1, # 控制线的宽度
                     )
    
    • 1
    • 2
    • 3

    202204150006

    如果你想换成横的怎么办?不用我说了吧,你至少有2种方法!

    geom_crossbar()

    说实话这个函数我真用得不多。如果不是手贱看了下geom_error()的帮助文档,我还真不知道!

    当你运行?geom_errorbar的时候,跳出来的竟然是geom_crossbar {ggplot2}!

    果然我还是一个弱鸡!

    p+geom_crossbar(aes(x=mean,y=label,xmin=lower,xmax=upper))+theme_bw()
    
    • 1

    202204150007

    竟然是一个类似箱线图的条形!但是中间竖线位置是mean哦!

    这种图形在我的领域见得不多,不知道大家都用在哪里呢?

    OK,以上就是在ggplot2中画各种误差线的方法,学完这个,再配合森林图的教程,请别再告诉我你不会画森林图了!

    获取更多R语言知识,请关注公众号:医学和生信笔记

    医学和生信笔记,专注R语言在临床医学中的使用,R语言数据分析和可视化。主要分享R语言做医学统计学、meta分析、网络药理学、临床预测模型、机器学习、生物信息学等。

  • 相关阅读:
    哪款蓝牙耳机适合国庆出行?适合国庆出行的蓝牙耳机
    LCR 052.递增顺序搜索树
    物联网与 Linux 的相爱相生
    数仓4.0(三)------数据仓库系统
    使用Mac编写Thirft的HelloWorld项目
    【小5聊】使用div+css布局绘制32支球队比赛对阵图,拭目以待冠军花落谁家
    [附源码]计算机毕业设计JAVA高校知识产权管理系统论文2022
    春秋云镜 CVE-2014-4577
    五分钟搭建ftp服务器,真的不含糊
    天翼云推出全栈政务混合云 支持私有化运行
  • 原文地址:https://blog.csdn.net/Ayue0616/article/details/126107549