生信小白菜之ggplot2入门版教程


title: “Biotrainee Note5”
author: “yuluyang”
date: “2024-03-11”


生信技能树数据挖掘课程笔记~小洁老师授课

作图常用R包和函数

  1. 作图
    -base
    -ggplot2
    -ggpubr

  2. 拼图
    -mfrow
    -grid.arrange
    -cowplot
    -patchwork

  3. 图片保存与导出
    -经典三段论
    -ggsave
    -eoffice——topptx

base系统自带的基础绘图工具 了解即可
plot()
hist()
boxplot()
stripchart()
barplot()
dotplot()
piechart()
matplot()
lines()
curve()
abline()
points()
segments()
arrows()
axis()
...

了解ggplot2R包

ggplot2基本要素=数据与映射+几何对象+标尺+统计变换+坐标系统+图层+分面+主题
按图层作图的R包,图层包括三层——数据层data、几何图形Geometry和美学层Aesthetics,不同层之间用+连接起来,最终的图是由图层按顺序叠加展示
data必须是以data.frame格式
#标准代码示例
ggplot(data=iris)+                         # 都是用'+'连接函数
  geom_point(mapping = aes(x=Sepal.Length, # `ggplot2`里面列名是可以单打独斗存在的,不用带''
                           y=Petal.Length, # 把数据映射到x、y轴上
                           color=Species)) # 把物种`Species`映射到颜色上,同样是不用带''

# 映射`Mapping`:画图实际上是把数据中的变量映射到图形属性上
# `Aesthetics`记作`aes`也是映射,反映'x'、'y'、'color'、'size'、'shape'等

# 几何图形`Geometric Object`记作`Geom`,决定图形类型,如直方图、箱形图等
# 告诉`ggplot`,你想把前面的属性映射到散点或者折线上
# 不同的几何图形是可以叠加的,按代码顺序
# 不同的几何图形,要求的属性会有差别,当然这些属性也可以在几何图像映射时提供

## 统计变换`Statistics Transformation`记作`Stats`,数据的汇总形式,如直方图
## 坐标系统`Coordinate System`记作`coord`,作图所需的坐标轴与网格线
## 图层`Layer`(和几何对象是一个意思),将数据分解成子集,进行联合展示
## 分面`Facet`,对所需的绘图操作进行一层一层叠加,最终得到所需图形

ggplot2的特殊语法:列名不带引号,行末写加号

ggplot2入门级绘图模版
# ggplot(data = <data>)+
#  <geom_function>(mapping=aes(<mappings>))
ggplot(data=iris)+                           # `data=`属于形式参数可以省略  
  geom_point(mapping = aes(x=Sepal.Length,   # `mapping=`属于形式参数可以省略
                           y=Petal.Length))  # `x=`、`y=`也属于形式参数可以省略

ggplot(iris)+
  geom_point(aes(Sepal.Length,Petal.Length,color=Species)) # 这里`color`是`mapping=aes()`的参数,注意与后面作区分

ggplot(iris,aes(Sepal.Length,Petal.Length,color=Species))+
  geom_point()

ggplot2属性设置

  • 轮廓颜色color 可以使用字符串(颜色编码)或者’red’等
  • 大小size 单位是’mm’,代码里面只用写数据
  • 形状shape 不同形状对应具体编号
  • 透明度alpha
  • 填充颜色fill
    并不需要在代码里面都写上,每个属性都有自己的默认值,不想写就直接使用默认
手动设置
ggplot(data=iris)+
  geom_point(mapping=aes(x=Sepal.Length,y=Petal.Length),
               color="purple")  # 颜色设置这里要带"",而前面映射的时候是不用的         
## 这里`color=`是`geom_point()`的参数
                         
ggplot(data=iris)+
  geom_point(mapping=aes(x=Sepal.Length,
                         y=Petal.Length,
                         size=5,
                         alpha=0.8,
                         shape=4))

颜色名称一定要是可以识别出来的

映射Mapping:根据数据框的某一列来定义图的某个属性,即数据映到图像
ggplot(data=iris)+
  geom_point(mapping=aes(x=Sepal.Length,
                         y=Petal.Length,
                         color=Species)) #这里颜色设置是在`aes()`中,是`aes`的参数,后接列名
#而手动是在`geom_function()`中,是`geom_function`的参数,后接具体颜色
#映射:根据数据某一列内容分配颜色
#手动:把图形设置为一个或多个颜色,与数据内容无关
如果想自行指定映射的具体颜色
# 手动指定映射的颜色`scale_color_manual()`
ggplot(data=iris)+
  geom_point(mapping=aes(x=Sepal.Length,
                         y=Petal.Length,
                         color=Species)) + # 这个连接上下文的'+'不要忘记
  scale_color_manual(values=c("grey","green","yellow")) # `values=`不可以省略,因为它不是第一个参数

# 自行指定颜色集`scale_color_brewer()`
ggplot(data = iris)+
  geom_point(mapping = aes(x=Sepal.Length,
                         y=Petal.Length,
                         color=Species)) + 
  scale_color_brewer(palette = "Set1")
# 颜色选择可以参考十六进制颜色代码 ## 哈哈这是一个美术知识点
# 也可以用配色R包`RColorBrewer`
"red""orange""yellow""green""blue""purple""grey""pink" ## 哈哈娱乐一下
区分color和fill两个属性
# 空心形状、实心形状,只有一个颜色,用`color`设置即可
ggplot(data=iris)+
  geom_point(mapping=aes(x=Sepal.Length,
                         y=Petal.Length,
                         color=Species),
                         shape=17)
ggplot(data=iris)+
  geom_point(mapping=aes(x=Sepal.Length,
                         y=Petal.Length,
                         color=Species),
                         shape=2)

# `fill`是填充,既有边框又有内部颜色才需要`fill`和`color`两个参数
ggplot(data=iris)+
  geom_point(mapping = aes(x=Sepal.Length,
                         y=Petal.Length),
             shape=24,
             color="red",
             fill="yellow")
课堂练习
# 加载`test.Rdata`,以a、b列为横纵坐标,change列映射颜色,画点图
load("test.Rdata")
library(ggplot2)
ggplot(data=test)+
  geom_point(aes(a,b,color=change))

# 手动修改颜色
ggplot(data=test)+
  geom_point(aes(a,b,color=change))+
  scale_color_manual(values=c("darkgreen","grey","red"))
ggplot2其他代码
# 绘制直方图,针对连续变量
library(ggplot2)
ggplot(data= ,mapping=aes(x= ))+ geom_histogram()
# 绘制柱形图,针对离散变量
library(ggplot2)
ggplot(data= ,mapping=aes(x= ))+ geom_bar()
# 密度图绘制函数
library(ggplot2)
ggplot(data= ,mapping=aes(x= ))+ geom_density()
# 箱线图绘制函数
library(ggplot2)
ggplot(data= ,mapping=aes(x= ))+ geom_box()
# 抖动点
library(ggplot2)
ggplot(data= ,mapping=aes(x= ))+ geom_jitter()
# 线图
geom_line()
# 地毯图
geom_rug()
# 小提琴图
geom_violin()
# 垂线
geom_vline()
# 水平线
geom_hline()
ggplot2几何对象叠加
# 几何对象可以叠加
ggplot(data=iris)+                
  geom_smooth(mapping=aes(x=Sepal.Length,y=Petal.Length))+ 
  geom_point(mapping=aes(x=Sepal.Length,y=Petal.Length)) # `geom_function()`括号里属于局部设置
## `geom_smooth()`拟合曲线

ggplot(data=iris,mapping=aes(x=Sepal.Length,y=Petal.Length))+ # `ggplot()`括号里属于全局设置
  geom_smooth()+
  geom_point()
## 全局设置是对以下所有图层有效
## 局部设置只带该图层有效
利用自带数据练习叠加
ggplot(iris,aes(Species,Sepal.Width,fill=Species))+
  geom_boxplot()

ggplot(iris,aes(Species,Sepal.Width,fill=Species))+
  geom_boxplot()+
  geom_point() # 当你画出来发现这个图有点问题,那么就该往下学习了

代码不报错、图也能画出,就一定是正确的吗?
no no‼️图形很可能表达地不准确,这也是一种错误

ggplot2另一种点图——jitter抖动点
# 练习题箱图叠加点图,其中横纵坐标相同的点都重叠在了一个
# 明明有150个点,从图片上不到30个
# 这就是图片不能准确传达数据
# 那么就应该换一种图片表达形式

geom_point(position = "jitter")
geom_jitter() # 两种表达方式都可以

ggplot(iris,aes(Species,Sepal.Width,fill=Species))+
  geom_boxplot()+
  geom_jitter()

## 注意这个的颜色设定是`fill`参数
## 如果想指定颜色的话,要用`scale_fill_manual`或`scale_fill_brewer`

如果觉得jitter太跳脱,而point`太呆板,可以考虑蜜蜂图

https://www.yuque.com/xiaojiewanglezenmofenshen/dbwkg1/rhgmyb

ggplot2转置
# 当你代码已经写完了,而你想更换一下横纵坐标系
# `coord_flip()`效果类似于`t()`
ggplot(iris,aes(Species,Sepal.Width,fill=Species))+
  geom_boxplot()+
  geom_jitter()+
  coord_flip()
ggplot2主题
theme_bw() #白色背景主题
theme_grey() #默认主题
theme_classic() #经典主题
练习题
ggplot(iris,aes(Sepal.Width,Species))+
  geom_violin(aes(fill=Species))+
  scale_fill_manual(values=c("lightblue","darkgreen","pink"))+
  geom_boxplot()+
  geom_jitter(aes(shape=Species))
ggpbur
# 标准代码
library(ggpubr)
p=ggboxplot(iris,x="Sepal.Length",y="Petal.Length",color ="Species",shape="Species",add="jitter")
p 
# `ggpbur`和`ggplot2`都是可以赋值的,基础函数包是不可以的
# 赋值有利于后期拼图调整

# `ggpbur`常用于组间比较
p = ggboxplot(iris, x = "Species", y = "Sepal.Length",
              color = "Species", shape = "Species",add = "jitter")
p
my_comparisons <- list( c("setosa", "versicolor"),  # 先构建两两向量组合的`list`
                        c("setosa", "virginica"), 
                        c("versicolor", "virginica") )
p + stat_compare_means(comparisons = my_comparisons, # `stat_compare_means`
                       aes(label = after_stat(p.signif))) # `label = after_stat`

ggpbur相当于是阉割版的ggplot2,优点是代码简单明了更易读,缺点是形式更简单
sthda上有大量ggpubr出的图,搜代码直接用,基本不需要系统学习
‼️但它的组间比较功能是hin不错滴

保存与导出图片
# `ggplot2`(包括ggpubr)通用保存代码
ggsave("iris_box_ggpubr.png") # ‘图片的名称’
ggsave(p,filename="iris_box_ggpubr2.png") # `p`是你复制的画图代码
# 查看帮助文档,可以知道保存时如何调整图片细节,比如大小、像素等等
## ‼️注意,纯文本文件的后缀没有决定作用,但是图片文件后缀有,电脑会根据图片后缀决定你用什么软件打开它

# 通用的作图三段论
## 1.保存文件、代码 ggsave("xxx.pdf")
## 2.作图代码.      ....
## 3.关闭画板.      dev.off()
好用的小工具——eofficeR包
# 导出格式为ppt,全部元素都是可编辑模式
library(eoffice)
topptx(p,"iris_box_ggpubr.pptx")
## 但当元素过多不合适,ppt会卡
拼图工具——patchworkR包
# 万事先装包
# 装完不会用就按需百度

公众号:生信星球,搜索patchwork,由相关的推送讲解

代码可运行,但不出图
  • 可能因为画板被占用,先dev.off()运行至null device
  • 或者dev.new()
去哪里找现成的代码
  • 搜狗微信直接搜索
  • 微信公众号,大把人教你R语言
  • STHDA官网

  • 代码好找,关键在于你有没有相应的数据,以及是否有能力处理数据格式以符合代码要求
    数据类型、数据结构、组织方式、对应关系都需要对应示例数据一一检查

健明老师推荐的学习资料

https://ggplot2-book.org/facet.html ggplot2作者亲自写的书
http://www.sthda.com/english/wiki/ggplot2-essentials sthda网站的ggplot核心图表示例
http://www.cookbook-r.com/Graphs/ 绘图菜谱
http://www.sthda.com/english/wiki/ggplot2-essentials

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值