前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >R语言学习 - 柱状图

R语言学习 - 柱状图

作者头像
生信宝典
发布于 2018-02-05 03:46:10
发布于 2018-02-05 03:46:10
2.6K00
代码可运行
举报
文章被收录于专栏:生信宝典生信宝典
运行总次数:0
代码可运行

柱状图绘制

柱状图也是较为常见的一种数据展示方式,可以展示基因的表达量,也可以展示GO富集分析结果,基因注释数据等。

常规矩阵柱状图绘制

有如下4个基因在5组样品中的表达值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
data_ori <- "Grp_1;Grp_2;Grp_3;Grp_4;Grp_5
a;2.6;2.9;2.1;2.0;2.2
b;20.8;9.8;7.0;3.7;19.2
c;10.0;11.0;9.2;12.4;9.6
d;9;3.3;10.3;11.1;10"

data <- read.table(text=data_ori, header=T, row.names=1, sep=";", quote="")
data
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  Grp_1 Grp_2 Grp_3 Grp_4 Grp_5
a   2.6   2.9   2.1   2.0   2.2
b  20.8   9.8   7.0   3.7  19.2
c  10.0  11.0   9.2  12.4   9.6
d   9.0   3.3  10.3  11.1  10.0

整理数据格式,保留基因名字信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
library(ggplot2)
library(reshape2)
library(dplyr)
data_rownames <- rownames(data)
data_colnames <- colnames(data)
data$gene <- data_rownames
data_m <- melt(data, id.vars=c("gene"))
data_m
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   gene variable value
1          a    Grp_1   2.6
2          b    Grp_1  20.8
3          c    Grp_1  10.0
4          d    Grp_1   9.0
5          a    Grp_2   2.9
6          b    Grp_2   9.8
7          c    Grp_2  11.0
8          d    Grp_2   3.3

首先看下每个基因在不同组的表达情况

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 给定数据,和x轴、y轴所在列名字
# 直接使用geom_bar就可以绘制柱状图
# position: dodge: 柱子并排放置
p <- ggplot(data_m, aes(x=gene, y=value))
p + geom_bar(stat="identity", position="dodge", aes(fill=variable))

# 如果没有图形界面,运行下面的语句把图存在工作目录下的Rplots.pdf文件中
#dev.off()

柱子有点多,也可以利用mean±SD的形式展现

首先计算平均值和标准差,使用group_bygene分组,对每组做summarize

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 获取平均值和标准差
data_m_sd_mean <- data_m %>% group_by(gene) %>% dplyr::summarise(sd=sd(value), value=mean(value))
data_m_sd_mean <- as.data.frame(data_m_sd_mean)
data_m_sd_mean
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  gene        sd value
1         a 0.3781534  2.36
2         b 7.5491721 12.10
3         c 1.2837445 10.44
4         d 3.1325708  8.74

使用geom_errorbar添加误差线

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
p <- ggplot(data_m_sd_mean, aes(x=gene, y=value)) + 
    geom_bar(stat="identity") +
    geom_errorbar(aes(ymin=value-sd, ymax=value+sd))
p

设置误差线的宽度和位置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
p <- ggplot(data_m_sd_mean, aes(x=gene, y=value)) + 
    geom_bar(stat="identity", aes(fill=gene)) +
    geom_errorbar(aes(ymin=value-sd, ymax=value+sd), width=0.2, position=position_dodge(width=0.75))
p

每个基因的原始表达值堆积柱状图 (只需要修改positon=stack)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# position="fill" 展示的是堆积柱状图各部分的相对比例
# position="stack" 展示的是堆积柱状图的原始值
p <- ggplot(data_m, aes(x=variable, y=value)) +
    geom_bar(stat="identity", position="stack", aes(fill=gene)) +
    geom_text(aes(label=value), position=position_stack(vjust=0.5))
p

堆积柱状图显示没问题,但文本标记错位了

指定下分组信息,位置计算就正确了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# position="fill" 展示的是堆积柱状图各部分的相对比例
# position="stack" 展示的是堆积柱状图的原始值
p <- ggplot(data_m, aes(x=variable, y=value, group=gene)) +
    geom_bar(stat="identity", position="stack", aes(fill=gene)) +
    geom_text(aes(label=value), position=position_stack(vjust=0.5))
p

比较每组各个基因的相对表达 (position=fill)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# position="fill" 展示的是堆积柱状图各部分的相对比例
# position="stack" 展示的是堆积柱状图的原始值,可以自己体现下看卡差别
p <- ggplot(data_m, aes(x=variable, y=value)) +
    geom_bar(stat="identity", position="fill", aes(fill=gene))
p

纵轴的显示改为百分比

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
p <- ggplot(data_m, aes(x=variable, y=value)) +
    geom_bar(stat="identity", position="fill", aes(fill=gene)) +
    scale_y_continuous(labels = scales::percent)
p

在柱子中标记百分比值

首先计算百分比,同样是group_by (按照给定的变量分组,然后按组操作)和mutate两个函数(在当前数据表增加新变量)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# group_by: 按照给定的变量分组,然后按组操作
# mutate: 在当前数据表增加新变量
# 第一步增加每个组的加和,第二步计算比例
data_m <- data_m %>% group_by(variable) %>% mutate(count=sum(value)) %>% mutate(freq=round(100*value/count,2))

再标记相对比例信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
p <- ggplot(data_m, aes(x=variable, y=value, group=gene)) +
    geom_bar(stat="identity", position="fill", aes(fill=gene)) +
    scale_y_continuous(labels = scales::percent) +
    geom_text(aes(label=freq), position=position_fill(vjust=0.5))
p

长矩阵分面绘制

再复杂一些的矩阵 (除了有不同时间点的信息,再增加对照和处理的信息)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
library(ggplot2)
library(reshape2)
library(dplyr)

data_ori <- "Gene;Group;Expr;Condition
a;T1;2.6;Control
b;T1;20.8;Control
c;T1;10;Control
d;T1;9;Control
a;T2;2.9;Control
b;T2;9.8;Control
c;T2;11;Control
d;T2;3.3;Control
a;T3;2.1;Control
b;T3;7;Control
c;T3;9.2;Control
d;T3;10.3;Control
a;T4;2;Control
b;T4;3.7;Control
c;T4;12.4;Control
d;T4;11.1;Control
a;T5;2.2;Control
b;T5;19.2;Control
c;T5;9.6;Control
d;T5;10;Control
d;T1;2.6;Treatment
b;T1;20.8;Treatment
c;T1;10;Treatment
a;T1;9;Treatment
d;T2;2.9;Treatment
b;T2;9.8;Treatment
c;T2;11;Treatment
a;T2;3.3;Treatment
a;T3;2.1;Treatment
c;T3;7;Treatment
b;T3;9.2;Treatment
d;T3;10.3;Treatment
a;T4;2;Treatment
c;T4;3.7;Treatment
b;T4;12.4;Treatment
d;T4;11.1;Treatment
a;T5;2.2;Treatment
d;T5;19.2;Treatment
c;T5;9.6;Treatment
b;T5;10;Treatment"

data_m <- read.table(text=data_ori, header=T, sep=";", quote="")
head(data_m)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  Gene Group Expr Condition
1    a    T1  2.6   Control
2    b    T1 20.8   Control
3    c    T1 10.0   Control
4    d    T1  9.0   Control
5    a    T2  2.9   Control
6    b    T2  9.8   Control

首先看下每个基因在不同组的表达情况, facet_gridfacet_wrap可以对图形分面显示。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# scales: free_y 表示不同子图之间使用独立的Y轴信息
#         但x轴使用同样的信息。
#         其它可选参数有free_x, free, fixed
p <- ggplot(data_m, aes(x=Gene, y=Expr)) + 
    geom_bar(stat="identity", position="dodge", aes(fill=Group)) +
    facet_grid(Condition~., scales="free_y")
p
# 如果没有图形界面,运行下面的语句把图存在工作目录下的Rplots.pdf文件中
#dev.off()

柱子有点多,也可以利用mean±SD的形式展现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 获取平均值和标准差
# 分组时不只Gene一个变量了,还需要考虑Condition
data_m_sd_mean <- data_m %>% group_by(Gene, Condition) %>% dplyr::summarise(sd=sd(Expr), value=mean(Expr))
data_m_sd_mean <- as.data.frame(data_m_sd_mean)
data_m_sd_mean
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  Gene Condition        sd value
1    a   Control 0.3781534  2.36
2    a Treatment 2.9978326  3.72
3    b   Control 7.5491721 12.10
4    b Treatment 4.8299068 12.44
5    c   Control 1.2837445 10.44
6    c Treatment 2.9458445  8.26
7    d   Control 3.1325708  8.74
8    d Treatment 6.8568943  9.22
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
p <- ggplot(data_m_sd_mean, aes(x=Gene, y=value)) + 
    geom_bar(stat="identity", aes(fill=Gene)) +
    geom_errorbar(aes(ymin=value-sd, ymax=value+sd), width=0.2, position=position_dodge(width=0.75)) +
    facet_wrap(~Condition, ncol=1)
p

每组里面各个基因的相对表达, 纵轴的显示改为百分比

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# position="fill" 展示的是堆积柱状图各部分的相对比例
# position="stack" 展示的是堆积柱状图的原始值,可以自己体现下看卡差别
p <- ggplot(data_m, aes(x=Group, y=Expr)) +
    geom_bar(stat="identity", position="fill", aes(fill=Gene)) +
    scale_y_continuous(labels = scales::percent) +
    facet_wrap(~Condition, ncol=1)
p

facet后,显示正常,不需要做特别的修改

在柱子中标记百分比值 (计算百分比值需要注意了, 文本显示位置还是跟之前一致)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# group_by: 按照给定的变量分组,然后按组操作
# mutate: 在当前数据表增加新变量
# 第一步增加每个组 (Group和Condition共同定义分组)的加和,第二步计算比例
data_m <- data_m %>% group_by(Group, Condition) %>% mutate(count=sum(Expr)) %>% mutate(freq=round(100*Expr/count,2))
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
p <- ggplot(data_m, aes(x=Group, y=Expr, group=Group)) +
    geom_bar(stat="identity", position="fill", aes(fill=Gene)) +
    scale_y_continuous(labels = scales::percent) +
    geom_text(aes(label=freq), position=position_fill(vjust=0.5)) +
    facet_wrap(~Condition, ncol=1)
p

文本显示位置没有问题,但柱子的位置有些奇怪,使得两组之间不可比。

先对数据做下排序,然后再标记文本

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# with: 产生一个由data_m组成的局部环境,再这个环境里,列名字可以直接使用
data_m <- data_m[with(data_m, order(Condition, Group, Gene)),] 
p <- ggplot(data_m, aes(x=Group, y=Expr, group=Group)) +
    geom_bar(stat="identity", position="fill", aes(fill=Gene)) +
    scale_y_continuous(labels = scales::percent) +
    geom_text(aes(label=freq), position=position_fill(vjust=0.5)) +
    facet_wrap(~Condition, ncol=1)
p

这样两种条件下的比较更容易了

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

本文分享自 生信宝典 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
R语言学习笔记——柱形图
今天分享R语言中的柱形图,所有图表语法都基于ggplot2包中的ggplot函数完成 。 其实R语言本身就带有各种作图函数,比如plot、bar、pie等,而且语法非常简单明了,为什么还要用ggplot2这种语法独立性很强、自成体系的作图包来作图呢? 一个例子就能感受到: plot(mpg$cty,mpg$hwy)#R语言内置散点图函数(无需加载任何辅助工具包) ggplot(mpg,aes(cty, hwy)) + geom_point(colour="steelblue")+labs(x = "City
数据小磨坊
2018/04/11
3.7K0
R语言学习笔记——柱形图
R语言学习 - 热图美化
热图美化 上一期的绘图命令中,最后一行的操作抹去了之前设定的横轴标记的旋转,最后出来的图比较难看。 上次我们是这么写的 p <- p + xlab("samples") + theme_bw() + theme(panel.grid.major = element_blank()) + theme(legend.key=element_blank()) 为了使横轴旋转45度,需要把这句话theme(axis.text.x=element_text(angle=45,hjust=1, vjust=1))放在
生信宝典
2018/02/05
2.6K0
R语言学习 - 热图美化
是Excel的图,不!是R的图
excel作为一个强大的统计工具,自身包含着一部分数据可视化的功能。R作为可视化的大势,自然也可以画出这些图,有一篇就通过ggplot2包进行了部分总结,甚是有趣,小编复刻学习了一番,现对代码做简单注释,以作分享。
生信宝典
2019/08/01
4.1K0
是Excel的图,不!是R的图
R语言画图——生信技能书
geom_point(mapping = aes(x = Sepal.Length,
用户11211038
2024/07/18
1010
累积柱状图加误差棒
最近做实验太累,感觉没有特别多的时间好好读文献了。可能这一段时间更新的会比较慢。今天先来点轻松地~
Listenlii-生物信息知识分享
2020/05/28
1.7K0
跟着Nature学作图:R语言ggplot2堆积柱形图完整示例
https://www.nature.com/articles/s41586-022-04664-7#Sec33
用户7010445
2023/01/06
4.2K0
跟着Nature学作图:R语言ggplot2堆积柱形图完整示例
ggplot2绘图(R_03)
画图的思维:1.我的数据适合什么样的图?2.搜画图代码 3.仿制示例数据 4.套代码,调细节
用户10803254
2023/10/23
2680
R语言作图
作图baseggplot2 ★ggpubr拼图par里的mfrowgrid.arrange cowplotcustomLayoutpatchwork ★导出经典三段论ggsave ★(属于ggplot2,可以存储)eoffice (可以导出为ppt)ggplot2语法入门级绘图模板ggplot(data=<DATA>)+ <GEOM_FUNCTION>(mapping=aes(<MAPPINGS>)) #ggplot() 括号里面是数据 例如 ggplot(data=iris)+ geom_po
大胖橘
2023/03/14
1.6K0
ggplot2多图Panel 组合【facet_wrap() and facet_grid()】
今天就说下ggplot在绘制多图时候的一些骚操作。R里面的ggplot绘图很强大,有时候一张图可能满足不了我们的需求,需要分组展示,同时放在同一个Panel内。这时候ggplot里面的(facet_wrap() and facet_grid())[https://www.r-graph-gallery.com/ggplot2-package.html]就提供了极大的便利。 本文主要介绍:
Jamesjin63
2022/11/03
1.4K0
ggplot2多图Panel 组合【facet_wrap() and facet_grid()】
全网最全的R语言基础图形合集
直方图是一种对数据分布情况进行可视化的图形,它是二维统计图表,对应两个坐标分别是统计样本以及该样本对应的某个属性如频率等度量。
生信学习者
2024/06/12
950
全网最全的R语言基础图形合集
ggplot2绘制科研数据柱状图~
ggplot2是一个神奇的R包,可以将自己的统计数据绘制成想要的图案。从今天起小编计划为各位观众老爷们带来一个ggplot2的系列教程。那么首先呢,大家在可视化自己的科研数据时,最最最常用的就是绘制一个带误差或者显著值的柱状图。
作图丫
2022/03/29
2.7K0
ggplot2绘制科研数据柱状图~
文献配套GitHub发表级别绘图之饼图
ggplot2是R语言最流行的第三方扩展包,是RStudio首席科学家Hadley Wickham读博期间的作品。根据其绘图理念,图形由以下几个模块组成:
生信技能树
2022/03/03
2.1K0
文献配套GitHub发表级别绘图之饼图
R语言可视化——多系列柱形图(条形图)与分面组图美化技巧!
今天跟大家分享多系列与分面组图的美化技巧! 昨天讲的关于多序列柱形图与条形图美化技巧,其实还漏掉了一些一点儿。 当数据序列比较多的时候,特别是超过四个以后,还用堆积柱形图(条形图)、或者簇状柱形图的话,图表必然会因为系列太多而受到挤压或者变形,整体就会不协调、不美观。 还有ggplot不支持次坐标轴功能,它的作图思维基本源于塔夫脱的可视化理念,而且作者个人的审美也接受次坐标轴(大牛任性),但是他留给大家解决多序列图表的方案是——分面组图~ data<-data.frame(Name = c("苹果","谷歌
数据小磨坊
2018/04/11
6K0
R语言可视化——多系列柱形图(条形图)与分面组图美化技巧!
R语言基础绘图教程——第5章:直方图和柱状图
R基础教程可先阅读:R语言编程基础第一篇:语法基础 1 barplot()函数绘制 数据: Group Count1 Count2 Control 10 8 Drug1 28 13 Drug2 23 14 Drug3 9 18 Drug4 15 6 #读入数据 data = read.table("barplot.txt",header=T) #绘制条形图,仔细喊下面没一行代码都生成一个图,看他们的差别会知道参数是干嘛的。 barplot(data[,2]) barplot(data[,2],nam
DoubleHelix
2019/08/15
6.1K0
R语言基础绘图教程——第5章:直方图和柱状图
R语言ggplot2画分组堆积柱形图展示密码子偏向性的RSCU值
之前录制视频介绍过如何绘制堆积柱形图展示密码子偏向性的内容,但是之前的内容只能画一组堆积柱形图,如果你有好几个物种想要画到一起,可能比较麻烦,我记录一些我自己的画图代码
用户7010445
2021/07/12
3K0
R语言ggplot2画分组堆积柱形图展示密码子偏向性的RSCU值
R 语言柱状图示例笔记
柱状图的介绍就先到这里,其他可替代柱状图的图形包含棒棒糖图(Lollipop)、环形柱状图等未在本文中展开介绍,有兴趣的小伙伴可参考文章最后的参考资料。
章鱼猫先生
2021/10/15
1.6K0
R 语言柱状图示例笔记
24式R入门作图必学之barplot条形图(一)
柱状图又称条形图,在统计分析中的使用频率最高,也是众多小白入门R最早绘制的可视化图形。
生信初学者
2023/03/02
3.4K0
24式R入门作图必学之barplot条形图(一)
月更单细胞图表复现-文献1-第四和五集
但是我们的文字版推文还在第一篇文献,前面已经分享了3个:胃癌单细胞数据集GSE163558复现(二):Seurat V5标准流程,接下来是图表美化和单细胞亚群比例探讨:
生信技能树
2024/07/05
3020
月更单细胞图表复现-文献1-第四和五集
R语言 基础作图
*ggplot2中通过不同的geom函数生成图层,从前往后覆盖,因此需要考虑函数书写的顺序
Magnolia
2023/01/06
1.4K0
PD-L1抑制剂-TNBC-续集
18例患者有肿瘤活检样本,一半是atezo+paclitaxel组,一半是paclitaxel化疗组,2例患者在疾病进展后有肿瘤样本。Responder(R;n=9,包括CR/PR样本)或Non-responder(NR;n = 12,包括SD/PD样本),在联合治疗组获得了4例PR和7例SD,而在化疗组获得了5例PR,3例SD和2例PD, 1例not available。 这么看来,同样的11例患者,化疗组疗效更好啊,也不论PD-L1的表达。不过联合治疗组DCR 100%了
生信菜鸟团
2023/09/19
3171
PD-L1抑制剂-TNBC-续集
相关推荐
R语言学习笔记——柱形图
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档