前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >生信入门马拉松之R语言基础- R语言作图(Day 6)

生信入门马拉松之R语言基础- R语言作图(Day 6)

原创
作者头像
Crazy_George
发布2024-04-16 04:29:10
2440
发布2024-04-16 04:29:10
举报
文章被收录于专栏:R语言

Day6. R语言作图

【小洁老师语录】画图的目的是展示自己的数据 【小洁老师语录】ggplot2的特殊语法:列名不带引号,行末写加号

1. ggplot2

1.1 几何对象

几何对象可以叠加

代码语言:r
复制
library(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函数是局部图层+局部图层

ggplot(data = iris,mapping = aes(x = Sepal.Length,y = Petal.Length))+
  geom_smooth()+
  geom_point()#这个代码和上一句代码运行结果一致,简化写法,ggplot()中设置是全局设置,对于代码中所有的geom函数都有效,自定义可以在局部的函数中设置

1.2 练习题

  • 搜索引擎搜索箱线图-boxplot
代码语言:r
复制
ggplot(iris)+
  geom_boxplot(mapping = aes(x = Species,y = Sepal.Width,fill = Species))
boxplot
boxplot

代码语言:r
复制
library(ggplot2)
ggplot(iris)+
  geom_boxplot(mapping = aes(x = Species,y = Sepal.Width,fill = Species))+
  geom_point(mapping = aes(x = Species,y = Sepal.Width))
#或者
ggplot(iris,mapping = aes(x = Species,y = Sepal.Width))+
  geom_boxplot(mapping = aes(fill = Species))+
  geom_point()

  • boxplot和point图叠加后作图的问题:点的数量和真实数据不一致,因此这个作图有歧义,会错误表达数据!

怎么改变歧义:使用如下代码作图

代码语言:r
复制
ggplot(iris,mapping = aes(x = Species,y = Sepal.Width,fill = Species))+
  geom_boxplot()+
  geom_point(position = "jitter")
#或
ggplot(iris,mapping = aes(x = Species,y = Sepal.Width,fill = Species))+
  geom_boxplot()+
  geom_jitter()

【小洁老师语录】代码不报错,不代表真的没错,有歧义也是错误!不能将之发表于文字。

火山图可以由点图画出来

重启session(重新打开RStudio、重启R,打开新的session)时需要重新加载R包

1.3 坐标系

  • 矩阵行变列,列变行:转置(T)

coord_flip(): 反转坐标系,最后一行加上代码即可。

1.4 主题

【小洁老师语录】作图不用默认主题,要追求颜值!!!

theme_bw()#改主题,该代码可去掉默认主题中的灰色格子。

1.5 ggplot2基础语法

ggplot(data = <DATA>)+

<GEOM_FUNCTION>(

mapping = aes(<MAPPINGS>),

position = <POSITION位置>

)+

<COORDINATE_FUNCTION坐标系>+

<THEME_FUNCTION主题>

1.6 补充ggpubr

代码语言:r
复制
library(ggpubr)
p <- ggboxplot(iris,x = "Species",y = "Sepal.Length",
               color = "Species",shape = "Species",add = "jitter")
p

ggpubr的新手友好函数:

代码语言:r
复制
my_comparisions <- list(c("setosa","versicolor"),
                        c("setosa","virginica"),
                        c("versicolor","virginica"))
p + stat_compare_means(comparisons = my_comparisions,
                     aes(label = after_stat(p.signif)))
#comparisons参数要求很严格:必须有列表;列表里必须是长度为2向量组成的;第三这些向量里""里的的值必须是图的横坐标;三个要求缺一就会报错!!!

1.7 图片保存

save_export.R

  • ggplot2系列

ggsave("iris_box_ggpubr.png(图片名称和格式)")或

ggsave(p,filename = "iris_box_ggpubr.png(图片名称和格式)")

后缀不可以写错,必须是存在的图片格式

  • 通用-三段论

第一段:保存的函数及文件名 > pdf("test.pdf(文件名称.pdf)")#❓pdf可以查看有哪些可以保存的格式

第二段:作图代码 > 吧啦吧啦你的作图的代码,可以容纳多多

第三段:画完了,关闭画板 > dev.off()


1.8 神奇R包 - eoffice

代码语言:r
复制
library(eoffice)#加载
topptx(p,"iris_box_ggpubr.pptx")#将图(变量p)保存到ppt内

为啥保存成ppt格式?

「时间紧迫时使用eoffice的R包」可以用ppt编辑图片,使用门槛比ps/ai低一些。图片的每一个点、线、字都可以成为可编辑元素。

超多点的图或超多行列的热图不适用ppt保存方式,因为ppt会变成卡卡!


1.9 拼图

R包patchwork:堪比R语言领域的“美图羞羞”

  • 语法简单,兼容ggplot2
  • 拼图比例设置简单,具体见下图和下图二维码。

patchwork
patchwork

1.10 练习


练习要求
练习要求

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

作业里认识到几个问题:

  • 图层叠加的问题:什么图层的图先写,哪个图层就在下边。先写图层在下边,后写图层在上边,有可能会掩盖!
  • 坐标置换:作图最后一句代码加一句coor_flip()代码
  • geom_violin(Species)代码会报错,找不到Species:这是因为这是映射,需要加aes(),应修改为geom_violin(mapping = aes(fill = Species))

1.11 画图网站 - sthda

先跑通示例代码,然后置换自己的数据

1.12 画图容易出现的几个问题

  • 代码可运行 但不出图- 画板被占用
代码语言:r
复制
dev.off()#关闭画板
#或
dev.new()#新建画板

1.13 去哪找现成画图代码?

该笔记工作目录下

基础包画图500行代码zz_basic plot ... .R

ggplot2画图50个案例:top50ggplot.html

小洁老师语雀的画图合集

如何控制横坐标、纵坐标顺序??

【小洁老师语录】现成的画图代码不难找,多搜搜,多找找 【小洁老师语录】画图代码 + 自己数据 + 解决问题的能力 = 美美的图

1.14 画图的正确思维

  • 数据适合用什么图展示?

文献参考等

  • 搜画图的代码

代码可复制,图片美观

提供了代码配套的示例数据

示例代码+示例数据>画出示例数据的图

  • 仿制示例数据

弄清代码里需要的数据类型、数据结构

理清组织方式、对应关系

  • 套代码,调细节

【小洁老师语录】避免手搓代码!!!!!

2. R语言的综合应用

【小洁老师语录】发现问题的眼睛,面对困难的信心,解决问题的能力

tidyverse,大神的包,小的生态系统,《R数据科学》

2.1 玩转字符串(3🌟)



代码语言:r
复制
rm(list = ls())
if(!require(stringr))install.packages('stringr')
library(stringr)

x <- "The birch canoe slid on the smooth planks."
x
### 1.检测字符串长度
str_length(x)#返回42(字符串的长度)
length(x)#返回1(向量的元素)

### 2.字符串拆分
str_split(x," ")#为何拆分成列表?列表第几个元素,就是拆分出向量的第几个元素
class(str_split(x," "))#列表
x2 = str_split(x," ")[[1]];x2#提取出向量

y = c("jimmy 150","nicker 140","tony 152")
str_split(y," ")
str_split(y," ",simplify = T)#该参数简化作用,输出结果变成矩阵

### 3.按位置提取字符串
str_sub(x,5,9)

### 4.字符检测(非常重要‼️)
str_detect(x2,"h")#产生结果是与x2相等的逻辑值向量,可用于按照逻辑值筛选
str_starts(x2,"T")
str_ends(x2,"e")
### 5.字符串替换
x2
str_replace(x2,"o","A")#只替换每个元素字符串的一个字符
str_replace_all(x2,"o","A")

### 6.字符删除
x
str_remove(x," ")#只删除每个元素字符串的一个字符
str_remove_all(x," ")

2.2 练习

代码语言:r
复制
#我的回答
x1 = read.csv("group.csv")
x2 <- x1$title
x2
library(stringr)
x3 <- str_remove_all(x2,"A375 cells 24h ")
x3
x4 <- str_remove_all(x3," rep1")
x4
x5 <- str_remove_all(x4," rep2")
x6 <- str_remove_all(x5," rep3")
x6

x7 <- str_replace(x6,"C","c")
x8 <- str_replace(x7,"V","v")
x8

load("test1.Rdata")

#先按照symbol找出不重复的行
unique(ids["symbol"])
或
unique(ids$symbol)
然后提取出相关行的行名
raw <- rownames(unique(ids["symbol"]))
raw
class(raw)#返回结果是字符串

raw2 <- as.numeric(raw)
class(raw2)
raw2#数字组成的向量

ids2 <- ids[raw2,];ids2
代码语言:r
复制
#小洁老师的答案,应用了字符串拆分,步骤非常简化,比我的简单多了,我的步骤繁琐。

a <- read.csv("group.csv")
g <- str_split(a$title," ",simplify = T)#转化成矩阵
g
g2 <- g[,4];g2

#或
str_sub(a$title,16,-6)
str_remove_all(a$title,"A375 cells 24h | rep1| rep2| rep3")#我想到了管道符,但是用法错了,我想这里加深了对管道符的理解了

#或
str_remove_all(a$title,"A375 cells 24h | rep\\d")#\\dd代表任意数字

tolower(g[,4])#大写换小写的函数1
str_to_lower(g[,4])#大写换小写的函数2

2.3 玩转数据框

代码语言:r
复制
arrage()#排序

arrage(test,Sepal.Length)#加引号不会排序,而且不会报错。对表格按照第一列排序,默认从小到大

arrage(test,desc(Sepal.Length))#从大到小排序,没有为什么哦!

distinct()#去重复

distinct(test,Species,.keep_all = T)# .keep_all参数意思是是否保留其他列,T保留,F不保留


mutate()#数据框新增列

mutate(test,new = Sepal.Length*Sepal.Width)#运行完这句代码后test有几列?答案是列数不变,因为没有赋值就没有改变。test$new <- test$Sepal.Length*Sepal.Width

【小洁老师语录】R语言里修改,没有赋值就没有发生过!修改赋值修改赋值修改赋值!!!

代码语言:r
复制
select()#筛选列
filter()#筛选行

2.4 连续的步骤

代码语言:r
复制
x1 <- select(iris,-5)
x2 <- as.matrix(x1)
x3 <- head(x2,50)
pheatmap::pheatmap(x3)

#或
pheatmap::pheatmap(head(as.matrix(select(iris,-5)),50))#嵌套函数等于上边4句代码,非常不易读

#管道符号传递%>%

iris %>%
  select(-5) %>%
  as.matrix() %>%
  head() %>%
  pheatmap::pheatmap()# %>%前的代码,默认为下一个函数()里的第一个参数。易读,而且代码简单,缺点是降低运算速度。

彩虹括号设置:同一对括号同一个颜色;option > code > disply > use rainbow...搭配嵌套函数使用

2.5 条件和循环

if条件语句

if(一个逻辑值,不可以是多个逻辑值组成的向量,T的话执行code1,F不执行){code1}

2.6 GEO数据库

GEO > serirs > 感兴趣关键词搜索 > 芯片(关键词是expression profiling by array)和转录组数据(转录组的关键词expression profilingby HTS),可以用关键词筛选。样本数应大于6。物种筛选。

点样本看数据分布范围,有没有全部在0附近。有大量小于0就是不正常的。是否有分组信息?找实验分组,每个组应超过3个。

生信技能树公众号 生信入门马拉松课程

小洁老师

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Day6. R语言作图
    • 1. ggplot2
      • 1.1 几何对象
      • 1.2 练习题
      • 1.3 坐标系
      • 1.4 主题
      • 1.5 ggplot2基础语法
    • 1.6 补充ggpubr
      • 1.7 图片保存
      • 1.8 神奇R包 - eoffice
      • 1.9 拼图
    • 1.10 练习
      • 1.11 画图网站 - sthda
      • 1.12 画图容易出现的几个问题
      • 1.13 去哪找现成画图代码?
      • 1.14 画图的正确思维
    • 2. R语言的综合应用
      • 2.1 玩转字符串(3🌟)
      • 2.2 练习
      • 2.3 玩转数据框
      • 2.4 连续的步骤
      • 2.5 条件和循环
    • 2.6 GEO数据库
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档