R绘制多彩的森林图:基于ggplot2

Stella981
• 阅读 1550

点击蓝字 关注我们

R绘制多彩的森林图:基于ggplot2

上一周,我们介绍了一篇关于R语言绘制森林图(**forest plot)的帖子(来,挑一款你喜欢的森林图**),不知道没有帮助到各位朋友呢?今天给大家带来一个多彩的的森林图,这个森林图前些日子追加在了上一帖子的评论里,应该有朋友已经看到了。今天就该多彩森林图的实现做个简单介绍。

R绘制多彩的森林图:基于ggplot2

R绘制多彩的森林图:基于ggplot2

多彩的森林图

R绘制多彩的森林图:基于ggplot2

R绘制多彩的森林图:基于ggplot2

需要的R包

该森林图是使用R package:**ggplot2**绘制的,主要用的函数有_ggplot、geom_point、geom_errorbarh、geom_vline、theme和geom_text_。下面我们就一步一步来实现这一多彩森林图吧!

R绘制多彩的森林图:基于ggplot2

R程序

## 加载程序包

library(ggplot2)

##建立数据集(模拟编造的数据)

dataset <- data.frame(

Varnames = c("ART","WBC","CPR","DTA","EPC","FFT","GEO","HBC","PTT","JOK"),

OR = c(0.9, 2, 0.3, 0.4, 0.5, 1.3, 2.5, 1.6, 1.9, 1.1),

Lower=c(0.75, 1.79, 0.18, 0.2, 0.38, 1.15, 2.41, 1.41, 1.66, 0.97),

Upper=c(1.05, 2.21, 0.42, 0.6, 0.62, 1.45, 2.59, 1.79, 2.14, 1.23),

Factor = c('Not sig.', 'Risk', 'Protective', 'Protective', 'Protective', 'Risk', 'Risk', 'Risk', 'Risk', 'Not sig.'),

Sample=c(450, 420, 390, 400, 470, 390, 400, 388, 480, 460))

#查看数据集

View(dataset)

R绘制多彩的森林图:基于ggplot2

R绘制多彩的森林图:基于ggplot2

数据简介

R绘制多彩的森林图:基于ggplot2

对数据情况做个简单介绍

Varnames:变量名称;

OR:Odds Ratio;

Lower,Upper:95%CI下限及上限;

Factor:影响因素类型;

Sample:样本量。

基于这个数据集,我们开始绘制第一张草图:不同类型变量用不同颜色或形状表示。

R绘制多彩的森林图:基于ggplot2

R绘制多彩的森林图:基于ggplot2

R绘制多彩的森林图:基于ggplot2

画图吧!

R绘制多彩的森林图:基于ggplot2

##草图

p <- ggplot(dataset, aes(OR, Varnames, col=Factor)) # 不同形状shape= Factor

p + geom_point(size=3.6) +

   geom_errorbarh(aes(xmax =Upper, xmin = Lower), height = 0.4) +

   scale_x_continuous(limits= c(0.1, 2.6), breaks= seq(0, 2.5, 0.5)) +

   geom_vline(aes(xintercept = 1)) +

   xlab('Odds Ratio ') + ylab(' ')

# ggsave("forest1.png",dpi = 300,width = 33,height = 20,units = "cm")

R绘制多彩的森林图:基于ggplot2

R绘制多彩的森林图:基于ggplot2

上面已经完成了第一步,下面开始添加文字。

首先通过**data.frame**建立包含P Value和各变量对应的P值的数据框,在通过_geom_text_添加到图中。

## 建立注释内容

annotation <- data.frame(x=c(2.89, 2.89, 2.89, 2.89, 2.89,         2.89, 2.89, 2.89, 2.89, 2.89, 2.89),

       y=c(10.47, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1),

       label=c('P Value', '<0.001', '<0.001', '0.075','<0.001',

        '<0.001', '<0.001', '<0.001', '<0.001', '<0.001',                '0.650'))

## 半成品:添加内容

p <- ggplot(dataset, aes(OR, Varnames))

p + geom_point(size=3.6, aes(col=Factor)) +

   geom_errorbarh(aes(xmax = Upper, xmin = Lower), height = 0.4)+

   geom_vline(aes(xintercept = 1))+theme(legend.position = "top")+

   scale_x_continuous(limits=c(0.1, 2.9), breaks = seq(0, 2.5, 0.5))+

   geom_text(data=annotation,aes(x=x,y=y,label=label))+

xlab('Odds Ratio ') + ylab(" ")

R绘制多彩的森林图:基于ggplot2

目前是添加了P Value,如果是病例对照研究,我们还可以将病例和对照组暴露人数等数据添加进去。

这里灵活性很大,大家可以根据自己的需要添加相应内容。

R绘制多彩的森林图:基于ggplot2

建立注释内容

## 建立注释内容(这里也是杜撰的数据)

annotation <- data.frame(

x=c(-1.4, -0.9, -0.35, 1, 2.87, 2.87, 2.87, 2.87, 2.87, 2.87, 2.87, 2.87, 2.87, 2.87, 2.87, -1.4, -0.9, -1.4, -0.9, -1.4, -0.9, -1.4, -0.9, -1.4, -0.9, -1.4, -0.9, -1.4, -0.9, -1.4, -0.9, -1.4, -0.9, -1.4, -0.9, -0.35, -0.35, -0.35, -0.35, -0.35, -0.35, -0.35, -0.35, -0.35, -0.35),

y = c(10.47, 10.47, 10.47, 10.47, 10.47, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, 10, 9, 9, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1),

label=c('Event in Case', 'Event in Control', 'OR (95% CI)', 'Odds  Ratio','P Value', '<0.001', '<0.001', '0.075', '<0.001', '<0.001', '<0.001', '<0.001', '<0.001', '<0.001', '0.650', '17 (20%)',

'13 (16%)', '23 (23%)', '18 (18%)', '30 (28%)', '25 (24%)', '10 (20%)', '8 (16%)', '31 (27%)',

'25 (19%)','17 (20%)','13 (16%)','23 (23%)','18 (18%)','30 (28%)', '25 (24%)', '24 (28%)',

'20 (24%)', '17 (24%)', '12 (20%)', '2.00 (1.79-2.21)', '1.90 (1.66-2.14)', '1.10 (0.97-1.23)',

'1.6 0(1.41-1.79)', '2.50 (2.41-2.59)', '1.3 (1.15-1.45)', '0.5 (0.38-0.62)', '0.40 (0.20-0.60)',

'0.30 (0.18-0.42)', '0.90 (0.75-1.05)'))

R绘制多彩的森林图:基于ggplot2

成品1:添加注释内容

## 成品1:添加注释内容

p <- ggplot(dataset, aes(OR, Varnames))

p + geom_point(size=3.6, aes(col=Factor)) +

   geom_errorbarh(aes(xmax =Upper, xmin = Lower),height = 0.4)+

   geom_vline(aes(xintercept=1))+

   scale_x_continuous(limits=c(-1.5, 2.87), breaks=seq(0, 2.5, 0.5)) +

   xlab(' ') + ylab(" ") + theme_bw() + theme(legend.position ="top") +

   theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),

        plot.background = element_rect(fill ='skyblue', color ='red'),

        axis.text=element_text(size=10, face = "bold"),legend.text=element_text(size=11))+

        geom_text(data=annotation,aes(x=x,y=y,label=label))

R绘制多彩的森林图:基于ggplot2

R绘制多彩的森林图:基于ggplot2

如果是meta分析的森林图,想把样本量大小融入到图里,该如何做呢?

我的做法是用样本量大小去定义圆点的大小。

R绘制多彩的森林图:基于ggplot2

R绘制多彩的森林图:基于ggplot2

用样本量定义圆点大小

## 成品2:用样本量定义圆点大小

p + geom_point(aes(size = Sample, col = Factor)) +

   geom_errorbarh(aes(xmax = Upper, xmin = Lower), height = 0.4)+

   geom_vline(aes(xintercept = 1))+

scale_x_continuous(limits = c(-1.5, 2.87), breaks = seq(0,2.5, 0.5)) +

   xlab(' ')+ylab(" ") + theme_bw() + theme(legend.position ="top") +

   theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),

   plot.background = element_rect(fill ='skyblue', color ='red'),

   axis.text=element_text(size=10, face = "bold"),legend.text=element_text(size=11))+

   geom_text(data=annotation, aes(x=x, y=y, label=label))

R绘制多彩的森林图:基于ggplot2

R绘制多彩的森林图:基于ggplot2

大功告成,最后得到的就是生动形象的多彩的森林图啦!

R绘制多彩的森林图:基于ggplot2

本文分享自微信公众号 - 生信补给站(Bioinfo_R_Python)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Stella981 Stella981
2年前
Docker 部署SpringBoot项目不香吗?
  公众号改版后文章乱序推荐,希望你可以点击上方“Java进阶架构师”,点击右上角,将我们设为★“星标”!这样才不会错过每日进阶架构文章呀。  !(http://dingyue.ws.126.net/2020/0920/b00fbfc7j00qgy5xy002kd200qo00hsg00it00cj.jpg)  2
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这