前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2023.4生信马拉松day6-绘图

2023.4生信马拉松day6-绘图

原创
作者头像
清南
发布2023-04-17 21:06:20
1K0
发布2023-04-17 21:06:20
举报

上节内容回顾

注:未单独说明的图片均引用自 生信技能树小洁老师
注:未单独说明的图片均引用自 生信技能树小洁老师

本节思维导图

这个还真是我自己画的 因为老师没画/(ㄒoㄒ)/~~
这个还真是我自己画的 因为老师没画/(ㄒoㄒ)/~~

课前准备工作:

代码语言:txt
复制
#设置镜像
options("repos"=c(CRAN="http://mirrors.tuna.tsinghua.edu.cn/CRAN/"))
#安装R包
if(!require(ggplot2))install.packages('ggplot2',update = F,ask = F)
if(!require(ggpubr))install.packages('ggpubr',update = F,ask = F)
if(!require(eoffice))install.packages("eoffice",update = F,ask = F)
if(!require(patchwork))install.packages("patchwork",update = F,ask = F)
#加载以检查是否安装成功
library(ggplot2)
library(ggpubr)
library(eoffice)
library(patchwork)

1. 常用可视化R包

-(1)作图:

base包、ggplot2、ggpubr(ggpubr对ggplot2进行了简化和美化,适用于新手入门,可操作空间较小)

代码语言:txt
复制
#示例体验
#1.基础包 略显陈旧 了解一下
plot(iris[,1],iris[,3],col = iris[,5]) 
text(6.5,4, labels = 'hello')
dev.off() #关闭画板

#2.ggplot2 中坚力量,语法有个性
library(ggplot2)
ggplot(data = iris)+
  geom_point(mapping = aes(x = Sepal.Length,
                           y = Petal.Length,
                           color = Species))

#3.ggpubr 新手友好型 ggplot2简化和美化 褒贬不一
library(ggpubr)
ggscatter(iris,
          x="Sepal.Length",
          y="Petal.Length",
          color="Species")

-(2)拼图:

par里的mfrow、grid.arrange、cowplot、customLayout、patchwork(最新的、兼容性好、代码简单,用这一个就够够的了)

-(3)导出:

ggsave(是ggplot2里的一个函数)、eoffice-topptx(把图片导成ppt)、经典三段论

2.基础包

-(1)高级绘图函数

画完整的图用的,可以单独运行;

-(2)低级绘图函数

用于给图片添加点/线/标注;不能单独运行;

代码语言:txt
复制
plot(iris[,1],iris[,3],col = iris[,5])  #画图
#给图片加标注
text(6.5,4, labels = 'hello')  #没有前一行的话这行单独运行不了的

3. ggplot2:中坚力量,语法有个性

-(1)ggplot2的特殊语法:

列名行名输入时不带引号,行末写+号连接不同函数(最后一行不用);

-(2)初级绘图模板:

仅指定数据和横纵坐标;

仅指定数据和横纵坐标
仅指定数据和横纵坐标

实例:

代码语言:txt
复制
ggplot(data = iris)+
  geom_point(mapping = aes(x = Sepal.Length,
                           y = Petal.Length)

-(3)属性设置(颜色、大小、透明度、点的形状,线型等)

① 手动设置(不常用)

手动设置可以指定的属性包括:

颜色color——可指定的参数是字符串型的颜色名称,“blue”,“red”;

填充颜色fill,跟color可选的范围相同;

大小size——单位是mm;

透明度alpha

形状shape,不同形状有0-20的代号;

不同形状的代号
不同形状的代号

实例:

代码语言:txt
复制
#2.1 手动设置,需要设置为有意义的值
ggplot(data = iris) + 
  geom_point(mapping = aes(x = Sepal.Length,
                           y = Petal.Length), 
             color = "blue")

ggplot(data = iris) + 
  geom_point(mapping = aes(x = Sepal.Length, y = Petal.Length), 
             size = 5,     # 点的大小5mm
             alpha = 0.5,  # 透明度 50%
             shape = 8)  # 点的形状

② 映射:把某个属性和数据框的某一列关联起来

例如:将颜色这种属性和数据框的某一列关联起来,每个取值对应一种颜色;

代码语言:txt
复制
#2.2 映射:按照数据框的某一列来定义图的某个属性
ggplot(data = iris)+
  geom_point(mapping = aes(x = Sepal.Length,
                           y = Petal.Length,
                           color = Species))

③ 映射 vs 手动设置

映射中,color是aes的参数,输入不带引号的列名;手动设置时 colorgeom_point的参数,要求是带引号的颜色名称;

手动设置设置多个颜色非常出力不讨好,跟数据关联起来了再指定颜色就好;

映射也可以手动修改映射到的颜色而不必使用默认分配的颜色,具体操作为用scale_color_manual(values = c("blue","grey","red"))来指定;

注:其中颜色不仅可以用“blue”这样的名字来指定,还可以使用十六进制颜色代码来指定,这样想要什么颜色就有什么颜色;

实例:

代码语言:txt
复制
## Q1 能不能自行指定映射的具体颜色?
ggplot(data = iris)+
  geom_point(mapping = aes(x = Sepal.Length,
                           y = Petal.Length,
                           color = Species))+
  scale_color_manual(values = c("blue","grey","red"))
#手动设置设置多个颜色非常出力不讨好,跟数据关联起来了再指定颜色就好;
代码语言:txt
复制
## Q2 区分color和fill两个属性
### Q2-1 空心形状和实心形状都用color设置颜色
ggplot(data = iris)+
  geom_point(mapping = aes(x = Sepal.Length,
                           y = Petal.Length,
                           color = Species),
             shape = 17) #17号,实心的例子

ggplot(data = iris)+
  geom_point(mapping = aes(x = Sepal.Length,
                           y = Petal.Length,
                           color = Species),
             shape = 2) #2号,空心的例子

### Q2-2 既有边框又有内心的,才需要color和fill两个参数,color管边框的颜色,fill管填充的颜色;
ggplot(data = iris)+
  geom_point(mapping = aes(x = Sepal.Length,
                           y = Petal.Length,
                           color = Species),
             shape = 24,
             fill = "black") #24号,双色的例子

-(4)分面

facet_wrap(~)函数把一张图分成多张子图,~ 前面是横着分面的参数,~ 后面是竖着分的参数;

小贴士:不要修改内置数据,因为你忘记你改过它就会开始怀疑人生。

代码语言:txt
复制
#3.分面
ggplot(data = iris) + 
  geom_point(mapping = aes(x = Sepal.Length, y = Petal.Length)) + 
  facet_wrap(~ Species) 
代码语言:txt
复制
#双分面
dat = iris
dat$Group = sample(letters[1:5],150,replace = T)   
#sample是抽样,replace = T表示是不放回的抽样,抽样数不能大于样本总数;

ggplot(data = dat) + 
  geom_point(mapping = aes(x = Sepal.Length, y = Petal.Length)) + 
  facet_grid(Group ~ Species) 

练习6-1

代码语言:txt
复制
# 1.加载test.Rdata,分别test的以a和b列作为横纵坐标,change列映射颜色,画点图。
load("test.Rdata")
ggplot(data = test)+
  geom_point(mapping = aes(x = a,
                           y = b,
                           color = change))
# 2.尝试修改点的颜色为 暗绿色(darkgreen)、灰色、红色
ggplot(data = test)+
  geom_point(mapping = aes(x = a,
                           y = b,
                           color = change))+
  scale_color_manual(values = c("darkgreen","grey","red"))

# 补充知识:如何修改图形中标注
# 画图
p <- ggplot(df, aes(x = x, y = y)) + geom_point()
# 修改列名
p <- p + labs(x = "新的 x 轴标签", y = "新的 y 轴标签", title = "新的图形标题")

-(5)几何对象

geom_point这样的函数画出来的点就是一个几何对象,一个箱线图也是一个几何对象,一个线图+其阴影也是一个几何对象;即一个函数画出来的所有东西是一个几何对象;

不同的几何对象可以叠加;

代码语言:txt
复制
#直接叠加——局部设置(仅对当前图层有效),较为啰嗦;
ggplot(data = iris) + 
  geom_smooth(mapping = aes(x = Sepal.Length, 
                          y = Petal.Length))+
  geom_point(mapping = aes(x = Sepal.Length, 
                           y = Petal.Length))

#全局设置(对所有图层有效),更加简洁;
ggplot(data = iris,mapping = aes(x = Sepal.Length, y = Petal.Length))+
  geom_smooth()+
  geom_point()

-(6)统计变换

geom开头的函数是几何对象函数;

stat开头的函数是统计变换函数;

一般来说不用stat开头的函数;

代码语言:txt
复制
View(diamonds)
table(diamonds$cut)

ggplot(data = diamonds) + 
  geom_bar(mapping = aes(x = cut))

ggplot(data = diamonds) + 
  stat_count(mapping = aes(x = cut))  #统计并可视化

#这两个函数都能画出来一个柱状图
#只指定了x,纵坐标是统计得到的数量

#6.1.不统计,数据直接做图

代码语言:txt
复制
fre = as.data.frame(table(diamonds$cut))
fre
ggplot(data = fre) +
  geom_bar(mapping = aes(x = Var1, y = Freq), stat = "identity")   
#stat = "identity"就可以避免统计而是使用给定的统计结果直接作图

#6.2 不统计直接的数量而是统计比例——将count改为prop

代码语言:txt
复制
ggplot(data = diamonds) + 
  geom_bar(mapping = aes(x = cut, y = ..prop.., group = 1))
#为了和y=某列名进行区分,需要再prop前后加两个..;
#group = 1是指把所有的数据作为一个整体,否则会把每一个柱子都画成1;

练习6-2

尝试写出下图的代码;尝试在此图上叠加点图。

数据是iris,x轴是Species,y轴是Sepal.Width
数据是iris,x轴是Species,y轴是Sepal.Width
代码语言:txt
复制
# 1.尝试写出下图的代码
ggplot(data = iris,mapping = aes(x = Species,
                                 y = Sepal.Width,
                                 color = Species))+
  geom_boxplot()
#这样画出来是空心的彩色的,给的示例图是填充彩色边框黑色,所以应该用fill指定颜色:
ggplot(data = iris,mapping = aes(x = Species,
                                 y = Sepal.Width,
                                 fill = Species))+
  geom_boxplot()
代码语言:txt
复制
# 2. 尝试在此图上叠加点图,
ggplot(data = iris,mapping = aes(x = Species, 
                                y = Sepal.Width,
                                fill = Species)) + 
  geom_boxplot()+
  geom_point()
# 这样画出来point有重叠,species本来每组应该有50个点;仅看图片看不出来实际上有50个点,会造成歧义;
#解决办法:用 geom_jitter() 函数防止重叠,把横坐标不限制到一个位置,而是“抖动一下”
ggplot(data = iris,mapping = aes(x = Species, 
                                y = Sepal.Width,
                                fill = Species)) + 
  geom_boxplot()+
  geom_jitter()

-(7)位置调整

练习6-2中提到的geom_jitter()函数用于设置横坐标区域就是一种位置调整;

此外还有堆叠式直方图v.s.并列式直方图这种位置调整,二者可以用position=doge这一参数进行变换;

代码语言:txt
复制
#普通的点图
ggplot(data = iris,mapping = aes(x = Species, 
                                 y = Sepal.Width,
                                 fill = Species)) + 
  geom_boxplot()+
  geom_point()
# 7.1 抖动的点图
ggplot(data = iris,mapping = aes(x = Species, 
                                 y = Sepal.Width,
                                 fill = Species)) + 
  geom_boxplot()+
  geom_jitter()
代码语言:txt
复制
# 7.2堆叠直方图
ggplot(data = diamonds) + 
  geom_bar(mapping = aes(x = cut,fill=clarity))

# 7.3 并列直方图
ggplot(data = diamonds) + 
  geom_bar(mapping = aes(x = cut, fill = clarity), position = "dodge")

-(8)坐标系变换

coord_flip()翻转坐标系

coord_polar()改用极坐标系

代码语言:txt
复制
bar <- ggplot(data = diamonds) + 
  geom_bar(
    mapping = aes(x = cut, fill = cut), 
    width = 1
  ) + 
  theme(aspect.ratio = 1) +
  labs(x = NULL, y = NULL)
bar
bar + coord_flip()
bar + coord_polar()

ggplot2 小结——完整的绘图模板

基础+映射+统计+位置变换+坐标系变换+分面
基础+映射+统计+位置变换+坐标系变换+分面

练习6-3

画出这个图:

answer:

代码语言:txt
复制
ggplot(data = iris,mapping = aes(x = Species,y = Sepal.Width))+
  geom_violin(aes(fill = Species))+
  geom_boxplot()+
  geom_jitter(aes(shape = Species))+
  coord_flip()

4. ggpubr

相比ggplot2,ggpubr淡化了映射和手动设置的区别,淡化了图层的概念,更加简单好上手;深入后还是需要回归到ggplot2;

ggpubr 搜代码直接用,基本不需要系统学习;

sthda上有大量ggpubr出的图,可以套用;

-(1)ggpubr绘图实例:

代码语言:txt
复制
library(ggpubr)
ggscatter(iris,x="Sepal.Length",
          y="Petal.Length",
          color="Species")
#在ggplot2后+theme=classic可以去掉背景的灰色和格子,达到ggpur的主题效果;
#要把ggplot2的图例从右边挪到头顶改怎么办?
theme(legend.position = "top")
代码语言:txt
复制
p <- ggboxplot(iris, x = "Species", 
               y = "Sepal.Length",
               color = "Species", 
               shape = "Species",
               add = "jitter")
p
#可以画出类似练习6-1的图

-(2)ggpur特色的方便功能——组间比较:

比较前,comparisons参数的数据要求:把三组需要两两比较的数据两个两个组成一个向量,放到一个list里面;

代码语言:txt
复制
my_comparisons <- list( c("setosa", "versicolor"), 
                        c("setosa", "virginica"), 
                        c("versicolor", "virginica") )
p + stat_compare_means(comparisons = my_comparisons)+ # Add pairwise comparisons p-value
  stat_compare_means(label.y = 9)   #把比较结果放到y=9的位置

5.图片的保存和导出

-(1)ggplot系列图(包括ggpubr)通用的简便保存:ggsave()函数

代码语言:txt
复制
p <- ggboxplot(iris, x = "Species", 
               y = "Sepal.Length",
               color = "Species", 
               shape = "Species",
               add = "jitter")
ggsave(p,filename = "iris_box_ggpubr.png") 
#注意:图片的后缀名相当关键

-(2)通用的三段论

代码语言:txt
复制
pdf("iris_box_ggpubr.pdf")  #注意前后的pdf要对应,保存png的话要把两个pdf都改成png,否则图出不来;
boxplot(iris[,1]~iris[,5])
text(6.5,4, labels = 'hello')
dev.off()   #画完图以后关闭画板

-(3)神器——eoffice包,将图片导出为ppt,全部元素都是可编辑模式

代码语言:txt
复制
library(eoffice)
topptx(p,"iris_box_ggpubr.pptx")

注:不要过度依赖eoffice,拼图用贼好用的patchwork可以有效避免重复劳动!!!而且语法简单,兼容ggplot2。

一个patchwork的使用教程

patchwork特点:

支持p1+p1直接拼图,比任何包都简单;

复杂的布局代码易读性强;

可以给子图添加标记,如ABCD,I II III IV;

可以统一修改所有子图;

可以将子图的图例移到一起;

6.问题&小结

-(1)代码可运行却不出图——画板被占用

代码语言:txt
复制
dev.off()     #回复null device,已关闭画板还运行会报错,报错没关系
dev.new()   #新建画板

-(2)去哪里找现成的画图代码

现成的代码不难找——

① 火山图、热图直接到搜索引擎搜代码;

STHDA网站上找代码、数据、教程;

③ 扩展资料-R_03工作目录下的各种扩展学习(基础包500行代码&ggplot2的50个实例)

④ 生信星球制作发布的画图合辑

——扩展学习:因子factor,用来自行控制横纵坐标;

-(3)画图代码+你的数据+你解决问题的能力=你的图

① 我的数据适合用什么图展示?

② 从类似的文章里参考对比、其他学习资料涉及的图片;

③ 搜索画图代码的要求:代码可复制、图片美观;提供了代码配套的示例数据;示例代码+示例数据可复现;

④ 仿制示例数据:比较数据类型&数据结构,将自己的数据调成与示例数据一致;包括组织方式(转置解决)、对应关系等等;

⑤ 套代码,调细节;


tips:

画图最重要的是实践!多画多看才会越来越强!

数据组织往往比后面的调代码更加重要!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 上节内容回顾
  • 本节思维导图
  • 课前准备工作:
  • 1. 常用可视化R包
    • -(1)作图:
      • -(2)拼图:
        • -(3)导出:
        • 2.基础包
          • -(1)高级绘图函数
            • -(2)低级绘图函数
            • 3. ggplot2:中坚力量,语法有个性
              • -(1)ggplot2的特殊语法:
                • -(2)初级绘图模板:
                  • -(3)属性设置(颜色、大小、透明度、点的形状,线型等)
                    • -(4)分面
                      • 练习6-1
                        • -(5)几何对象
                          • -(6)统计变换
                            • 练习6-2
                              • -(7)位置调整
                                • -(8)坐标系变换
                                  • ggplot2 小结——完整的绘图模板
                                    • 练习6-3
                                    • 4. ggpubr
                                      • -(1)ggpubr绘图实例:
                                        • -(2)ggpur特色的方便功能——组间比较:
                                        • 5.图片的保存和导出
                                          • -(1)ggplot系列图(包括ggpubr)通用的简便保存:ggsave()函数
                                            • -(2)通用的三段论
                                              • -(3)神器——eoffice包,将图片导出为ppt,全部元素都是可编辑模式
                                              • 6.问题&小结
                                                • -(1)代码可运行却不出图——画板被占用
                                                  • -(2)去哪里找现成的画图代码
                                                    • -(3)画图代码+你的数据+你解决问题的能力=你的图
                                                    领券
                                                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档