森林图最重要的内容之一就是误差线,前面介绍过多种森林图的画法了,今天学习下误差线的各种画法,基于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
加载R包
library (ggplot2)
提供一个基本图:
p <- ggplot(data = df,aes(color = group))
geom_errorbarh()和geom_errorbar() 这两个函数是一样的用法,都是用来画误差线的,看名字就知道只有一点点小小的差别!
h 不就代表horizontal 吗,水平的,横着的!
geom_errorbar()
:默认是画竖直方向的误差线,比如在条形图上面添加误差线这种画法,需要提供x
,ymin
和ymax
,确定误差线上下两个端点的位置;geom_errorbarh()
:默认是画水平方向的误差线,需要提供y
,xmin和
xmax`,确定误差线左右两个端点的位置。先看看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()
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()
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()
202204150003 果然是十分完美的!
但既然是ggplot2
系列,那必须优雅!直接给你提供一个geom_pointrange()
函数。
p+geom_pointrange(aes(x=mean,y=label,xmin=lower,xmax=upper), size=1 , # 控制线的宽度 fatten = 0.6 # 控制点的大小 )
202204150004 那竖直方向的怎么画?是不是还有一个geom_pointrangeh()
函数?
不好意思,还真没有。你至少可以通过2种方法实现。
首先是翻转:
p+geom_pointrange(aes(x=mean,y=label,xmin=lower,xmax=upper), size=1 , # 控制线的宽度 fatten = 0.6 # 控制点的大小 )+ coord_flip()
202204150005 或者在映射横纵坐标时换一下:
p+geom_pointrange(aes(x=label,y=mean,ymin=lower,ymax=upper), size=1 , # 控制线的宽度 fatten = 0.6 # 控制点的大小 )
202204150005 怎么样,是不是非常简单?
那么还有一个geom_linerange()
函数,顾名思义,只有线,没有点!其实你可以通过给geom_pointrange()
函数设置为点的大小为0实现这种效果。
p+geom_linerange(aes(x=label,y=mean,ymin=lower,ymax=upper), size=1, # 控制线的宽度 )
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()
202204150007 竟然是一个类似箱线图的条形!但是中间竖线位置是mean哦!
这种图形在我的领域见得不多,不知道大家都用在哪里呢?
OK,以上就是在ggplot2
中画各种误差线的方法,学完这个,再配合森林图的教程,请别再告诉我你不会画森林图了!