首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >跟着Nature microbiology学画图~堆积柱形图+箱线图以及组合图

跟着Nature microbiology学画图~堆积柱形图+箱线图以及组合图

作者头像
用户7010445
发布于 2020-12-08 02:54:15
发布于 2020-12-08 02:54:15
5.6K0
举报

今天要模仿的图片来自于论文 Core gut microbial communities are maintained by beneficial interactions and strain variability in fish。期刊是 Nature microbiology

image.png

重复的图片是Figure1中的堆积柱形图和箱线图,然后将其组合

需要的工具及准备

本次可视化基于windows 10系统。

  • 数据存储和准备:Microsoft Excel,text
  • 数据可视化:R version 4.0.3 和 R Studio,用来要绘制、修饰和整合:堆积柱状图(Stacked Histogram ), 箱图(box plot),柱状图(bar chart),Venn图(Venn diagram),泡泡图(bubble plot),曲线图(Line Graph) 安装请参考:https://www.jianshu.com/p/1a0f25086e8b两者下载地址分别是:R: https://www.r-project.org/R Studio: https://rstudio.com/products/rstudio/download/
  • 辅助工具Adobe Photoshop CS4: 做出来的图中的一些文字标记进行一定的修补等。
数据准备与实现:
堆积柱状图(Stacked Histogram ):
  • 数据准备:一般可视化最重要的一部分就是数据的准备,请看以下图,给出了对应的数据内容,以下简作说明:第一列:是分组,即共四个组。第二列:每个组里的不同物种。第三列:每个分组里的每个物种的相对丰度。

这样分清层次后,我就自己生成了以下数据,并存为CSV格式。

  • 需要的R 包即具体实现过程:
代码语言:javascript
AI代码解释
复制
install.packages('ggplot2') #安装ggplot画图包
library(ggplot2)#导入ggplot包

然后就是要读取数据了,为了方便初学者,我用file.choose跳出框来读取:

代码语言:javascript
AI代码解释
复制
df<-read.csv(file.choose())

点击enter,会跳出框,选择刚才的csv文件,即完成了读取,数据内容可以点击

代码语言:javascript
AI代码解释
复制
df

查看:

说明没问题,是得到了dataframe;这样:数据准备好了,作图的工具也准备好了,那么我们就开始作图:

代码语言:javascript
AI代码解释
复制
ggplot(df,aes(x=Status,y=Relative.abundance....,fill=Taxonomy))   +     geom_bar(stat = 'identity', width = 0.3, position = 'fill')

image.png

说明:ggplot(作图用的dataframe,aes(x=组名的列,y=丰度数值,fill=按照物种类型着色)) + geom_bar(stat = 'identity', width =柱子的宽度 , position = 'fill' 则会铺满整个高度,如果删除则会显示如下这种图(复制以下代码再运行就会明白))

代码语言:javascript
AI代码解释
复制
ggplot(df,aes(x=Status,y=Relative.abundance....,fill=Taxonomy))   +     geom_bar(stat = 'identity', width = 0.5)

image.png

然而发现:背景颜色为灰色而且带着线条,难看,所以去掉背景颜色和线条,即

代码语言:javascript
AI代码解释
复制
ggplot(df,aes(x=Status,y=Relative.abundance....,fill=Taxonomy))   +     geom_bar(stat = 'identity', width = 0.3, position = 'fill')+theme_set(theme_bw())+theme(panel.grid.major=element_line(colour=NA))

说明:theme_set(theme_bw())#去掉背景色, theme(panel.grid.major=element_line(colour=NA)) #去掉线条颜色

这样就得到以下图,离目标越来越近了:

发现目标图里的横坐标标签存在一定角度的,那么横坐标和纵坐标标签用以下代码实现:

代码语言:javascript
AI代码解释
复制
ggplot(df,aes(x=Status,y=Relative.abundance....,fill=Taxonomy))   +     geom_bar(stat = 'identity', width = 0.3, position = 'fill')+theme_set(theme_bw())+theme(panel.grid.major=element_line(colour=NA))
+theme(axis.text.x = element_text(face="bold", color="black", size=10, angle=90), axis.text.y = element_text(face="bold", color="black", size=10))

image.png

删除横坐标轴的名称:

代码语言:javascript
AI代码解释
复制
ggplot(df,aes(x=Status,y=Relative.abundance....,fill=Taxonomy))   +     geom_bar(stat = 'identity', width = 0.3, position = 'fill')+theme_set(theme_bw())+theme(panel.grid.major=element_line(colour=NA))+theme(axis.text.x = element_text(face="bold", color="black", size=10, angle=90), axis.text.y = element_text(face="bold", color="black", size=10))
+theme(axis.title.x=element_blank())

image.png

发现如果角度设置为45的话,横坐标标签与坐标轴交叉,所以用theme的调节来拉开距离,

代码语言:javascript
AI代码解释
复制
p0<-ggplot(df,aes(x=Status,y=Relative.abundance....,fill=Taxonomy))   +     geom_bar(stat = 'identity', width = 0.3, position = 'fill')+theme_set(theme_bw())+theme(panel.grid.major=element_line(colour=NA))+theme(axis.text.x = element_text(face="bold", color="black", size=10, angle=45), axis.text.y = element_text(face="bold", color="black", size=10))+theme(axis.title.x=element_blank())+ theme(axis.text.x = element_text(angle = 45, hjust = 0.4, size = 10, vjust=0.4))

得到了较好的图:

  • 如果对其文字格式或字体需要继续调整,可以用ps实现。具体如下:1)首先将上述图输出:

2)用Adobe Photoshop CS4 打开,并选择工具---选择--delete删除文字部分;

3)ctrl+shift+N 新建图层--用文字工具输入标签---再点击选择工具,点击文字--输入-45度--应用---得到比较好看的理想图:

其他的文字部分也是类似处理并保存:得到下图

箱图box plot的绘制:
  • 简单箱图的绘制 箱图的表示的意义与理解请参考我之前的一个笔记:https://www.jianshu.com/p/54d4996d73cd

箱图数据的格式与要求:

同上:读取数据(是dataframe)

代码语言:javascript
AI代码解释
复制
bp<-read.csv(file.choose())
bp

作图:

代码语言:javascript
AI代码解释
复制
boxplot(bp, col = c("green","brown","purple","blue"),names = c("High marine Protein","Medium fat","High fat","Low marine protein"),  ylab = "Richness")

解释:boxplot(bp#选择上面的dataframe, col = c(#给每个箱图选择颜色,用英文标点双引号!"green","brown","purple","blue"),names = c(#给每个箱子命名"High marine Protein","Medium fat","High fat","Low marine protein"), ylab = #给纵轴起名"Richness") 得到:

发现目标图中,下标都单独拿出来形成了legend,这是想到其实ggplot直接作box plot就可以直接搞定,但是数据格式略有不同,准备的数据为:

代码语言:javascript
AI代码解释
复制
#读取数据
bp<-read.csv(file.choose())

然后进行作图:

代码语言:javascript
AI代码解释
复制
ggplot(bp, aes(x=Diet, y=Richness, fill=Diet)) + geom_boxplot()

得到:

这下就按照第一个堆积图的后续修饰,删除横坐标标签:

代码语言:javascript
AI代码解释
复制
ggplot(bp, aes(x=Diet, y=Richness, fill=Diet)) + geom_boxplot()+theme(axis.title.x=element_blank())

即得到:

或者再原图基础上可以删除横坐标的所有标签:

代码语言:javascript
AI代码解释
复制
p1<-p1+theme(axis.title.x=element_blank(),
         axis.text.x=element_blank(),
         axis.ticks.x=element_blank())
p1#会看到以下的结果:

image.png

第一张箱图先就这么搞定!为了后续合并图形结果,我们把这张赋值为p1, 即:

代码语言:javascript
AI代码解释
复制
p1<-ggplot(bp, aes(x=Diet, y=Richness, fill=Diet)) + geom_boxplot()+theme(axis.title.x=element_blank())

image.png

箱图2: 带p value的箱图的绘制

先要安装另外两个包:ggsignif这个显著性检验的包

代码语言:javascript
AI代码解释
复制
install.packages('ggsignif')

和ggthemr包:

代码语言:javascript
AI代码解释
复制
 install.packages('ggthemr') #主题配置包

如果ggthemr报错,则:用devtools搞定!方法:

代码语言:javascript
AI代码解释
复制
install.packages("devtools")# 先安装或更新
devtools::install_github('Mikata-Project/ggthemr')#安装ggthemr,如果提示选择None

并导入包:

代码语言:javascript
AI代码解释
复制
library(ggplot2)
library(ggthemr)   
library(ggsignif) 

这样就可以做正事了:

代码语言:javascript
AI代码解释
复制
#分组
compaired <- list(c("High marine Protein", "Medium fat"), c("High marine Protein","High fat"), c("High marine Protein","Low marine protein"),c("High fat", "Medium fat"),c("High fat", "Low marine protein"),c("High fat", "Low marine protein"))#先进行比较的分组

然后作图:

代码语言:javascript
AI代码解释
复制
ggthemr("flat") 
p2 <- ggplot(bp, aes(Diet, Richness, fill = Diet)) + geom_boxplot() + geom_signif(comparisons = compaired, step_increase = 0.3, map_signif_level = F, test = wilcox.test)
p2

得到wilcox.test()比较两组(非参数)差异分析标注的箱图,如下:

注:map_signif_level 如果为TRUE,显示方法为""=0.001, ""=0.01, ""=0.05,如果选择f会显示数值 即下图:NS 表示not significant 不显著

各类检验适用 的情况如下:

ggsignif主要的一个函数是geom_signif(),使用方法和ggplot2中其他的geom_***()一样,作为图层添加到图形中就可以,他的主要参数为:

另外要注意的是:做显著性检验的前提是数据要符合正态分布,对应的正态分布的检验可参考我之前的简单笔记:https://www.jianshu.com/p/0150a9233809

分组箱图的绘制

发现有一个箱图按照组别分箱,所以我们给原数据进行分组,数据如下:

然后对上述结果进行一个分组:

代码语言:javascript
AI代码解释
复制
p3<-p2+geom_boxplot()+facet_wrap(~gender)#分箱处理

运行得到分组的箱图:

用ggpubr实现多个箱图的合并与组合:
代码语言:javascript
AI代码解释
复制
install.packages('ggpubr')#安装包
library(ggpubr)#加载包

然后给定参数,进行组合:

代码语言:javascript
AI代码解释
复制
ggarrange(p0,p1,p2,p3,labels = c("A","B","C","D",ncol=2,nrow=2))#两行两列

说明:输入每个箱图的名字p0,p1,p2,p3,给定图名,几行几列,运行就可以得到组合图:

重要:去掉横坐标标签 对四张图都去除横坐标的标签:用的代码是:

代码语言:javascript
AI代码解释
复制
+theme(axis.title.x=element_blank(),
             axis.text.x=element_blank(),
             axis.ticks.x=element_blank())

具体实现为

代码语言:javascript
AI代码解释
复制
p0<-p0+theme(axis.title.x=element_blank(),
             axis.text.x=element_blank(),
             axis.ticks.x=element_blank())

p1<-p1+theme(axis.title.x=element_blank(),
             axis.text.x=element_blank(),
             axis.ticks.x=element_blank())

p2<-p2+theme(axis.title.x=element_blank(),
    axis.text.x=element_blank(),
    axis.ticks.x=element_blank())

p3<-p3+theme(axis.title.x=element_blank(),
             axis.text.x=element_blank(),
             axis.ticks.x=element_blank())

合并的代码

代码语言:javascript
AI代码解释
复制
ggarrange(p0,p1,p2,p3,labels = c("A","B","C","D",ncol=2,nrow=2))#两行两列

去除横坐标再合并的结果是:

对于文字部分的修订,文字格式的调整可以参考上述3.1.3 Adobe Photoshop CS4进行美化。

欢迎大家关注我的公众号

小明的数据分析笔记本

公众号二维码.jpg

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小明的数据分析笔记本 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
python实现自动向钉钉群推送消息
步骤一:【电脑钉钉 】-【群聊】-【群设置】-【智能群助手】-【添加更多】-【添加机器人】-【自定义】-【添加】,编辑机器人名称和选择添加的群组。
墨紫羽墨
2021/12/12
1.8K0
路由器日志通过钉钉机器人自动推送
由于申请的电信宽带IP不是固定的,每次变了IP又不知道,需要有个IP变更提醒的小功能。
萌海无涯
2020/05/09
1.3K0
PYTHON 连接钉钉传输工作数据监控
“我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第1篇文章,点击查看活动详情”
百里丶落云
2022/11/03
8380
PYTHON 连接钉钉传输工作数据监控
Python - 接入钉钉机器人
https://developers.dingtalk.com/document/robots/use-group-robots
小菠萝测试笔记
2021/11/18
1.1K0
Python - 接入钉钉机器人
python钉钉机器人自定义回复
然后去实现handle_client 就好了。篇幅有限。完整的代码关注公众号 罗尔街 即可获取
Michel_Rolle
2023/07/30
4.2K4
如何用Python发送告警通知到钉钉?
前不久,看到了明哥写的如何用Python发送警告通知到企业微信,想起来之前写过用Pytho发送指定格式数据到钉钉的服务,本文将之前的代码重构下,变成一个:利用Python监控服务器数据,然后有异常就通过钉钉发送给用户。
老表
2021/12/27
2.5K0
如何用Python发送告警通知到钉钉?
Python - 抓取 iphone13 pro 线下店供货信息并发送到钉钉机器人,最后设置为定时任务
盲猜是这个 storeSelectionEnabled 字段影响的,因为只有它是 False,当然也有猜过是下面的 pickupDisplay,但从命名来看,第一个才是影响是否可选中的字段
小菠萝测试笔记
2021/11/18
1K0
Python - 抓取 iphone13 pro 线下店供货信息并发送到钉钉机器人,最后设置为定时任务
开通与使用钉钉群机器人 [附API代码]
目录 开通方式 参考代码 使用示范 开通方式 免费,有群就能开,任何用户都可开 官方文档:自定义机器人接入 - 钉钉开放平台 注意事项:用电脑版钉钉来开通,手机上的不行。 参考代码 import time import hmac import hashlib import base64 import urllib.parse import io from pyzbar import pyzbar from PIL import Image import requests, json # 导入依赖
小锋学长生活大爆炸
2022/03/29
1.8K0
开通与使用钉钉群机器人 [附API代码]
python自动化高效办公第二期,带你项目实战【二】{数据可视化、发送邮件(定时任务监控)、python聊天机器人(基于微信、钉钉)}
API商城_API_API接口大全_API一站式采购基地百度智能云API商城-API一站式采购基地,API商城提供天气查询API、实名认证API、短信验证码、OCR识别等海量API服务。选购API服务,首选百度智能云API商城。
汀丶人工智能
2022/12/21
1.3K0
python自动化高效办公第二期,带你项目实战【二】{数据可视化、发送邮件(定时任务监控)、python聊天机器人(基于微信、钉钉)}
我是怎样用Shell脚本完成钉钉机器人消息推送的
我喜欢shell,是因为在Linux环境下,几乎可以完成所有的事儿,而且依赖问题几乎可以忽略不计(一些特殊环境除外)。 所从这个角度出发,我大部分的代码都会优选Shell,当shell无法完成时我才会借助第三方语言来辅助,比如:PHP、Python等
爱技术的小黄鸭
2023/06/15
2.2K2
我是怎样用Shell脚本完成钉钉机器人消息推送的
自动化系列(四)Python实现钉钉机器人
定期数据需求除了以邮件的形式交付外,也可以发送到工作群里通知相关人员及时关注,本文将介绍如何推送数据到钉钉群里并@相关人员及时关注。
HsuHeinrich
2023/02/24
1.6K0
自动化系列(四)Python实现钉钉机器人
从 0 到 1 使用 Python 开发一个钉钉群应答机器人[附完整源码]
很多时候,我们都希望计算机程序能够为我们自动化的处理一些学习、工作和生活上的任务,毕竟「偷懒」可是促进科技进步和社会发展的一大动力。基于这种需求,诞生了很多种自动化的工具,比如爬虫,自动地帮我们采集数据;比如智能问答机器人,自动地回答客户提出的问题。
州的先生
2021/06/21
5.7K0
从 0 到 1 使用 Python 开发一个钉钉群应答机器人[附完整源码]
使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)
    最近疫情比较严重,很多公司依靠阿里旗下的办公软件钉钉来进行远程办公,当然了,钉钉这个产品真的是让人一言难尽,要多难用有多难用,真的让人觉得阿里的pm都是脑残才会设计出这种脑残产品,不过吐槽归吐槽,该用还得用,虽然钉钉别的功能很鸡肋,但是机器人这个功能还是让人眼前一亮,属于比较极客的功能,它可以将第三方服务的信息聚合到钉钉群中,实现信息的自动化同步,例如:通过聚合Github、Gitlab等源码管理服务,实现源码更新同步;通过聚合Trello、JIRA等项目协调服务,实现项目信息同步;同事,支持Webhook协议的自定义接入,支持更多可能性,例如:将运维报警提醒、自动化测试的结果报告提醒、工作、生活日程安排(上班打卡、下班吃饭、健身、读书、生日、纪念日...)等等的提醒,通过自定义机器人聚合到钉钉中。
用户9127725
2022/08/08
1K0
使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)
把盏言欢,款款而谈,ChatGPT结合钉钉机器人(outgoing回调)打造人工智能群聊/单聊场景,基于Python3.10
    就像黑火药时代里突然诞生的核弹一样,OpenAI的ChatGPT语言模型的横空出世,是人工智能技术发展史上的一个重要里程碑。这是一款无与伦比、超凡绝伦的模型,能够进行自然语言推理和对话,并且具有出色的语言生成能力。
用户9127725
2022/12/09
2.1K0
把盏言欢,款款而谈,ChatGPT结合钉钉机器人(outgoing回调)打造人工智能群聊/单聊场景,基于Python3.10
Prometheus告警集成到钉钉
集成到钉钉 编写python flask脚本 cat > app.py <<EOF #!/usr/bin/python # -*- coding: utf8 -*- from flask import Flask from flask import request import time import hmac import hashlib import base64 import urllib import requests import json import sys reload(sys)
mikelLam
2022/10/31
6490
Python 运用Paramiko实现批量巡检
通过封装Paramiko这个SSH模块,我们可以实现远程批量管理Linux主机,在此基础上配合钉钉API接口可实现自动告警机制,定期自动检查设备状态,并推送到钉钉群内。
王瑞MVP
2022/12/28
1.3K0
Python 运用Paramiko实现批量巡检
Shell实现钉钉机器人定时消息通知
我们知道,之前的运维告警多通过SMS、Mail 等方式通知到相应的人员,难以实现随时随地的查看。随着手机APP的发展,很多告警开始发送到IM软件上去。目前比较常用的是发送到微信和钉钉上,不过微信发送时,需要开通企业公众号,比较麻烦。今天我们将重点放在钉钉上。群机器人是钉钉群的高级扩展功能,群机器人可以将第三方服务的信息聚合到群聊中,实现自动化的信息同步。借助钉钉机器人,通过官方提供的API,可以很方便的post数据到相应的接收人 。群机器人支持Webhook协议的自定义接入,支持更多可能性,例如:你可将运维报警通过自定义机器人聚合到钉钉群实现提醒功能。
非著名运维
2022/06/22
1.6K0
Shell实现钉钉机器人定时消息通知
红队作业 | 钉钉机器人远控服务器体验
钉钉,阿里巴巴出品,专为全球企业组织打造的智能移动办公平台,含PC版,IPad和手机版。远程视频会议,消息已读未读,DING消息任务管理,让沟通更高效;移动办公考勤,签到,审批,钉闪会,钉钉文档,钉钉教育解决方案,让工作学习更简单!
Ms08067安全实验室
2022/04/06
1.9K0
红队作业 | 钉钉机器人远控服务器体验
Android Studio 中编辑Groovy 脚本 给钉钉机器人发消息
最近有一些需求,需要学习和配置Groovy脚本。而电脑上安装的编译器Android Studio。
zinyan.com
2022/12/07
1.2K0
java 钉钉 "errcode":310000,"errmsg":"sign not match
事情是这样的,老大不知道从什么地方找了一个钉钉发送消息的代码,什么说明都没有,让把代码调试通!
赵哥窟
2021/06/11
4K0
java 钉钉 "errcode":310000,"errmsg":"sign not match
推荐阅读
相关推荐
python实现自动向钉钉群推送消息
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
首页
学习
活动
专区
圈层
工具
MCP广场
首页
学习
活动
专区
圈层
工具
MCP广场