前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >十一、画图(ggplot2、ggpubr)及图片保存

十一、画图(ggplot2、ggpubr)及图片保存

原创
作者头像
叮当猫DDM
修改2023-02-27 20:04:26
2K0
修改2023-02-27 20:04:26
举报
文章被收录于专栏:叮当猫学生信

生信技能树学习之画图

一、ggplot2与ggpubr作图时的代码之间的差异

代码语言:javascript
复制
## ggplot2
library(ggplot2)           ###用某一个包之前,最好先library()加载一下
ggplot(data = iris)+
  geom_point(mapping = aes(x = Sepal.Length,
                           y = Petal.Length,
                           color = Species))

## ggpubr     ###去掉了映射、去掉了语法加号+,列名需要带引号
library(ggpubr) 
ggscatter(iris,
          x="Sepal.Length",
          y="Petal.Length",
          color="Species")

ggplot2

入门级绘图模版、映射、分面、几何对象、统计变化、位置调整、坐标系

1.1 语法

需要作图数据和横纵坐标,横纵坐标是列名,列名不带引号,直接使用。第一行和第二行是不同的函数,需要用+连接起来。
需要作图数据和横纵坐标,横纵坐标是列名,列名不带引号,直接使用。第一行和第二行是不同的函数,需要用+连接起来。

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

1.2.1 手动设置

把图形设置为一个或n个颜色或者其他属性,与数据内容无关。

代码语言:javascript
复制
ggplot(data = iris) + 
  geom_point(mapping = aes(x = Sepal.Length,
                           y = Petal.Length), 
             color = "blue")      ##color是 geom_point 的参数,是合法输入,是具体的颜色。 
ggplot(data = iris) + 
  geom_point(mapping = aes(x = Sepal.Length, y = Petal.Length), 
             size = 5,      # 点的大小5mm
             alpha = 0.5,   # 透明度 50%
             shape = 8)     # 点的形状

1.2.2 映射:

按照数据框的某一列来定义图的某个属性,根据数据的某一列分配颜色等属性

代码语言:javascript
复制
##根据Species定义点的颜色
  ggplot(data = iris)+
  geom_point(mapping = aes(x = Sepal.Length,
                           y = Petal.Length,
                           color = Species))     ##color 是aes的参数,是不带引号的列名

映射:根据数据的某一列的内容设置颜色。

手动设置:把图形设置为一个或n个颜色,与数据内容无关。

Q1 :能不能自行指定映射的具体颜色? 想要自行指定映射的颜色,就必须要有映射。

代码语言:javascript
复制
ggplot(data = iris)+
  geom_point(mapping = aes(x = Sepal.Length,
                           y = Petal.Length,
                           color = Species))+
  scale_color_manual(values = c("blue","grey","red"))   ###自行指定映射的3个颜色

###color = Species / c("blue","grey","red") 是要匹配且同时出现的。

color中有几个取值,c()中就要有几个取值,两者必须是匹配且同时出现。

Q2 区分color和fill两个属性

空心形状和实心形状都用color设置颜色; 有填充无轮廓,或者轮廓和填充一样颜色用color;

既有边框又有内心的,才需要color和fill两个参数; 边框(轮廓)和填充颜色不一样时,外边用color,里边用fill。

代码语言:javascript
复制
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号,空心的例子

ggplot(data = iris)+
  geom_point(mapping = aes(x = Sepal.Length,
                           y = Petal.Length,
                           color = Species),
             shape = 24,
             fill = "black") #24号,双色的例子
三句代码运行出来的图片差异
三句代码运行出来的图片差异

1.2.3 分面

用来分面的函数 facet_wrap()

根据数据的某一列把一张图分成若干张子图;具体分成几张图就看用来分面的那一列有多少个取值。

用来分面的列需要满足以下条件:分类变量;取值数量有限,分面的个数是有限的

单分面

代码语言:javascript
复制
ggplot(data = iris) + 
  geom_point(mapping = aes(x = Sepal.Length, y = Petal.Length)) + 
  facet_wrap(~ Species)       ###单分面,括号内要加~

双分面

代码语言:javascript
复制
dat = iris                     ###不要修改原始数据,重新赋值,在新的文件上进行修改  
dat$Group = sample(letters[1:5],150,replace = T)  ###在a/b/c/d/e,5个字母中随机重复选取150个值,进行作图
ggplot(data = dat) + 
  geom_point(mapping = aes(x = Sepal.Length, y = Petal.Length)) + 
  facet_grid(Group ~ Species)    ###双分面  横着按Group的取值分面,竖着按Species的取值分面。

练习题6-1

# 1.加载test.Rdata,分别以test的a和b列作为横纵坐标,change列映射颜色,画点图

代码语言:javascript
复制
load("test.Rdata")
test
ggplot(data = test)+     
  geom_point(mapping = aes(x = a,
                           y = b,
                          color = change ))

###可以简写
load("test.Rdata")
ggplot(test)+
  geom_point(aes(x = a,
                 y = b,
                 color = change))

# 2.尝试修改点的颜色为暗绿色(darkgreen)、灰色、红色

代码语言:javascript
复制
  ggplot(data = test)+
  geom_point(mapping = aes(x = a,
                           y = b,
                           color = change ))+
  scale_color_manual(values = c("darkgreen","grey","red"))
  ###简写代码
  ggplot(test)+
  geom_point(aes(x = a,
                 y = b,
                 color = change))+
  scale_color_manual(values = c("darkgreen","grey","red"))
如果想更换颜色,可以把前面的代码中的颜色位置换一下。
如果想更换颜色,可以把前面的代码中的颜色位置换一下。
代码语言:javascript
复制
library(ggplot2)
ggplot(data = iris)+
geom_point(mapping = aes(x = Sepal.Length,
                         y = Petal.Length,
                         color = Species))+
scale_color_manual(values = c("blue","red","grey"))
#### 也可以写成下面这样,两种情况作出的图一样
a = c("blue","red","grey")
names(a) = unique(iris$Species)
ggplot(data = iris)+
geom_point(mapping = aes(x = Sepal.Length,
                         y = Petal.Length,
                         color = Species))+
scale_color_manual(values = a)

1.2.4 几何对象

几何对象可以叠加

趋势线图+点图

代码语言:javascript
复制
###局部设置
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()

1.2.5 统计变换

函数

代码语言:javascript
复制
###直方图
ggplot(data = diamonds) + 
  geom_bar(mapping = aes(x = cut))  
ggplot(data = diamonds) + 
  stat_count(mapping = aes(x = cut))

###geom_bar()可以用函数stat_count()替换,geom_bar()是几何对象的函数,stat_count()是统计变换的函数

###没有纵坐标y ,因为不需要设置y,y是自动计算的结果,表示x的个数。

统计变换使用场景

场景1: 使用表中数据直接做图,而不统计。

代码语言:javascript
复制
fre = as.data.frame(table(diamonds$cut))
fre
ggplot(data = fre) +
  geom_bar(mapping = aes(x = Var1, y = Freq), stat = "identity")

geom_bar()函数默认不能设置纵坐标y,如果非要设置纵坐标就加个参数 stat ="identity",不加参数会报错。

场景2:不统计数量,改为统计prop(比例)

代码语言:javascript
复制
ggplot(data = diamonds)+
  geom_bar(mapping =aes(x = cut, y =..prop.., group =1))

###用..prop..来与列名进行区分

练习6-2

代码语言:javascript
复制
###1.画箱线图
ggplot(data = iris)+
  geom_boxplot(mapping = aes(x = Species,
                           y = Sepal.Width,
                           color = Species))

ggplot(data = iris,mapping = aes(x = Species,
                                 y = Sepal.Width,
                                 color = Species))+
  geom_boxplot()
代码语言:javascript
复制
ggplot(data = iris,mapping = aes(x = Species, 
                                y = Sepal.Width,
                                fill = Species)) +     ###外边框是color控制,内部填充是fill
  geom_boxplot()                                       
外边框是color控制,内部填充是fill
外边框是color控制,内部填充是fill
代码语言:javascript
复制
ggplot(data = iris,mapping = aes(x = Species, 
                                y = Sepal.Width,
                                fill = Species)) + 
  geom_boxplot()+
  geom_point()           ###出现的点都集中在中间,需要换函数
  
ggplot(data = iris,mapping = aes(x = Species, 
                                y = Sepal.Width,
                                fill = Species)) + 
  geom_boxplot()+
  geom_jitter()
点的位置不同就和位置关系有关系
点的位置不同就和位置关系有关系

1.2.6位置关系

代码语言:javascript
复制
## 6.1抖动的点图
ggplot(data = iris,mapping = aes(x = Species, 
                                 y = Sepal.Width,
                                 fill = Species)) + 
  geom_boxplot()+
  geom_point()

ggplot(data = iris,mapping = aes(x = Species, 
                                 y = Sepal.Width,
                                 fill = Species)) + 
  geom_boxplot()+
  geom_jitter()

## 6.2堆叠直方图
ggplot(data = diamonds) + 
  geom_bar(mapping = aes(x = cut,fill=clarity))

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

1.2.7.坐标系

#翻转坐标系 coord_flip()

#极坐标系coord_polar()

ggpubr

基本函数:

代码语言:javascript
复制
ggscatter(iris,x="Sepal.Length",y="Petal.Length",color="Species")

叠加

箱线图和点图的叠加

代码语言:javascript
复制
ggboxplot(iris, x = "Species", y = "Sepal.Length",color = "Species", shape = "Species",
          add = "jitter")

ggpubr做图,可以赋值。而基础包画图不能赋值。

增加组间比较P值

ggpubr可以给箱线图增加组间比较P值,ggplot2不能。

代码语言:javascript
复制
p <- ggboxplot(iris, x = "Species", y = "Sepal.Length",color = "Species", shape = "Species",
          add = "jitter")                  ###画一张基础的图片 
my_comparisons <- list( c("setosa", "versicolor"), 
                        c("setosa", "virginica"), 
                        c("versicolor", "virginica") )
p + stat_compare_means(comparisons = my_comparisons)+   # 增加组间比较P值
  stat_compare_means(label.y = 9)  

p是做出来的基础的图片,p+stat_compare_means() 在原图的基础上叠加

增加组间比较P值函数:stat_compare_means() ;

比较对象需要提前定义,my_comparisons 就是需要提前设置的比较对象。

练习6-3

注意看图片的横纵坐标
注意看图片的横纵坐标
代码语言:javascript
复制
ggplot(data = iris,mapping = aes(x = Sepal.Width,  
                                 y = Species))+    
  geom_violin(aes(fill= Species))+    ##需要映射mapping =aes(),不能直接单独写fill= Species
  geom_boxplot()+
  geom_jitter(aes(shape= Species)) +   ###点图是分散抖动的,不能用point,只能用jitter。
  scale_shape_manual(values = c())    ###可以更改点的形状和颜色 
  theme_classic()   ### 去除图片的背景和格子
  theme_bw()        ### 去除图片的背景颜色,不去格子
  theme_minimal()   ### 去除图片背景颜色和一圈的格子
  theme(legend.position = "bottom")   ### 可以把图注的位置改到下边,图注想放在哪边就把英文字母改了。 
  
##3个函数,谁在前面,谁先出现,在最底层,就是说,先出现小提琴图,再出现箱线图,最后点图
##这里设置的坐标如果和图片中的横纵坐标一样后边就不用翻转,coord_flip()

ggplot(data = iris,mapping = aes(x = Species,
                                 y = Sepal.Width))+
  geom_violin(aes(fill= Species))+
  geom_boxplot()+
  geom_jitter()+
  coord_flip()   #前面设置的坐标和图片中的横纵坐标刚好相反,所以需要翻转

小技巧:

这里的横纵坐标不用一个字母一个字母敲上去,两种方法:

1.运行代码colnames(iris),然后在控制台复制;

2.x=iris $ tab键就能自动补齐,iris $ 删除或者不删除都不会报错。

图片保存的三种方法

#1.基础包作图的保存

代码语言:javascript
复制
pdf("iris_box_ggpubr.pdf")      ##保存的格式及文件名
####中间是画图代码
dev.off()       ###只有关闭画板,才能把图片保存成功,提示null device是正确的
                ###多次运行dev.off(),到null device为止,再重新运行出图代码,或dev.new()
                ### R语言中唯一一个报错了,可以不管的代码。

#2.ggplot系列图(包括ggpubr)通用的简便保存 ggsave

代码语言:javascript
复制
ggsave("iris_box_ggpubr.png")   
##如下例子:
p <- ggboxplot(iris, x = "Species", 
               y = "Sepal.Length",
               color = "Species", 
               shape = "Species",
               add = "jitter")
ggsave(p,filename = "iris_box_ggpubr.png")

画图的时候没办法设置长宽比例以及像素,但是保存时可以设置长宽比例及像素。

练习题:保存时可以设置长宽比例及像素

#3.eoffice包 导出为ppt,全部元素都是可编辑模式

代码语言:javascript
复制
library(eoffice)
topptx(p,"iris_box_ggpubr.pptx")
画图代码+自己的数据+解决问题的能力=自己想要的图
画图代码+自己的数据+解决问题的能力=自己想要的图

以上所有内容均来自在生信技能树的学习。

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ggplot2
  • 1.1 语法
  • 1.2 属性设置(颜色、大小、透明度、点的形状,线型等)
    • 1.2.1 手动设置
      • 1.2.2 映射:
        • 1.2.3 分面
          • 单分面
          • 双分面
        • 1.2.4 几何对象
          • 1.2.5 统计变换
            • 函数
            • 统计变换使用场景
          • 1.2.6位置关系
            • 1.2.7.坐标系
            • ggpubr
              • 基本函数:
                • 叠加
                  • 箱线图和点图的叠加
                  • 增加组间比较P值
              • 图片保存的三种方法
                • #1.基础包作图的保存
                  • #2.ggplot系列图(包括ggpubr)通用的简便保存 ggsave
                    • #3.eoffice包 导出为ppt,全部元素都是可编辑模式
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档