从零开始学画图(2)
hi,大家好,不知道上次的可视化学习的怎么样呢?
这一期是咱们零基础开始学画图系列教程的第二期
希望大家可以跟着我们的节奏慢慢掌握可视化的绘图流程哦
打卡还有神秘惊喜
那么我们话不多说,继续我们今天的可视化教学吧
下面我们首先对同样的输入数据进行不同的可视化
#制备输入数据df <- data.frame( x = c(3, 1, 5), y = c(2, 4, 6), label = c("a","b","c"))
晨曦解读
输入数据永远是我们后续分析的基础和灵魂
#绘图p <- ggplot(df, aes(x, y, label = label)) + labs(x = NULL, y = NULL) + # Hide axis label theme(plot.title = element_text(size = 12)) # Shrink plot titlep + geom_point() + ggtitle("point")p + geom_text() + ggtitle("text")p + geom_bar(stat = "identity") + ggtitle("bar")p + geom_tile() + ggtitle("raster")
晨曦解读
这里我们其实可以看到我们的第一步代码,其实本质上是设立了一个ggplot2对象,真正执行绘图功能并且决定我们后续是何种可视化的是后面geom_xxx函数
p + geom_line() + ggtitle("line")p + geom_area() + ggtitle("area")p + geom_path() + ggtitle("path")p + geom_polygon() + ggtitle("polygon")
晨曦解读
下面可以尝试做一下练习哦~
#下面这些可视化你可以尝试用什么函数进行绘制呢?1.Scatterplot(geom_point)2.Line chart(geom_freqpoly)
晨曦解读
这里给大家一个提示
请使用以下工具
Function reference • ggplot2 (tidyverse.org)
前面的图大多数都是针对两个变量,这两个变量不存在分组的情况下
但是让我们假定这样一种情况,我们绘图的数据中存在分组信息
也就是说除了变量X和变量Y以外,还有一个变量group,那么我们应该如何进行绘图呢?
可视化会变成什么样子呢?
#准备输入数据data(Oxboys, package = "nlme")head(Oxboys)#> Subject age height Occasion#> 1 1 -1.0000 140 1#> 2 1 -0.7479 143 2#> 3 1 -0.4630 145 3#> 4 1 -0.1643 147 4#> 5 1 -0.0027 148 5#> 6 1 0.2466 150 6
晨曦解读
从上面的数据我们可以很清楚的看到,这里是存在分组信息的
ggplot(Oxboys, aes(age, height, group = Subject)) + geom_point() + geom_line()
晨曦解读
探究一下如果group参数放在aes映射函数的外面会怎么样?
答案是函数不会运行,因为外面的实际参数并没有group函数,但是我们的color参数确实可以在外面,这样的话表示我们自己设定颜色,而不遵循映射
但是,这里我们还有一个疑问,如果我们不指定分组变量,可视化会怎样?
#不指定分组变量ggplot(Oxboys, aes(age, height)) + geom_point() + geom_line()
但是,如果我们没有特定的单一分组变量,而是多组变量来定义,那么我们可以使用下面的方法
这个时候我们可以通过使用interaction()函数来联合多个变量作为我们的变量信息
aes(group = interaction(school_id, student_id)).
如果我们想给我们的可视化添加拟合曲线来让其更加清晰
data(Oxboys, package = "nlme")head(Oxboys)ggplot(Oxboys, aes(age, height, group = Subject)) + geom_line() + geom_smooth(method = "lm", se = FALSE)
晨曦解读
但是显然上面这个拟合曲线并不是我们想要的
简单来说就是”太多了“!
因为我们每个变量的分组是一样的,我们想要绘制一个基于总体的拟合曲线
而不是每一个线的拟合曲线,所以我们要修改代码
ggplot(Oxboys, aes(age, height)) + geom_line(aes(group = Subject)) + geom_smooth(method = "lm", size = 2, se = FALSE)#> `geom_smooth()` using formula 'y ~ x'
晨曦解读
请仔细思考为什么我的代码改变成这个样子?
答案:其实我们是改变了全局映射和局部映射的关系
简单来说就是当我的分组信息在第一图层(全局映射),我的第一图层就全都是分组信息,然后我的拟合就需要为第一图层的每个分组信息进行拟合
但是当我的分组信息变为局部映射(第二图层),那么我们第二图层分组信息算是一个整体,所以我们拟合曲线是对整个第二图层进行拟合
当然也不需要大家强行理解,感到困惑的时候,简单修改一下,然后可视化一下即可~
比较多个变量最常见的图应该是什么,想必不用晨曦多说了
箱线图它来了
ggplot(Oxboys, aes(Occasion, height)) + geom_boxplot()
晨曦解读
提问:如果我想要DIY一下,我想要线的颜色改变一下,我需要修改什么参数?
回答:当然我们只需要添加一个geom_line函数就可以啦,因为ggplot2大家可以简单理解就是再玩一个拼图游戏
ggplot(Oxboys, aes(Occasion, height)) + geom_boxplot() + geom_line(colour = "#3366FF", alpha = 0.5)
晨曦解读
提问:老师,这个颜色参数去哪里找?我不知道
回答:这个颜色参数有以下两个网站可以找到,我这里都列了出来,大家如果感兴趣可以去看看
Aesthetic specifications • ggplot2 (tidyverse.org)
ColorSpace - Color Palettes Generator and Color Gradient Tool (mycolor.space)
这时候肯定会有小伙伴有疑问
老师,我学这些究竟如何应用在我的分析中的?
那么现在我就来演示一下,绘图技巧在分析中的应用
#这里我们使用前几篇推文中所使用的scRNA-seq的表达矩阵进行演示 expr <-data.frame(FetchData(object = scRNA, vars ="LYZ")) expr$Barcod<-rownames(expr) ident<-data.frame() ident<-data.frame(Barcod=names(Idents(object = scRNA_final)),orig.ident=Idents(object = scRNA_final)) c<-merge(expr,ident,by='Barcod')
晨曦解读
这时候肯定会有小伙伴说

老师,单细胞我不会啊,这我怎么学啊
没事滴,没事滴,我们到最后只是需要这个数据做个演示
就是下面这个样子
大家简单理解就是,LYZ是基因名,orig.ident是分组信息,箱线图其实就需要这两个信息足以
那我们常规的表达矩阵是不是下面这个样子
这个时候我们只需要确定我们要研究的Gene(观测),然后提取该Gene对应的小表达矩阵,然后转置,转换数据框,添加分组信息(这一步往往是参考临床信息得来的)然后也会得到我们最上面的那个数据结构
#简单可视化 library(ggplot2) ggplot(c,aes(orig.ident,LYZ,fill=orig.ident)) +geom_boxplot()
#DIY可视化 ggplot(c,aes(orig.ident,LYZ,fill=orig.ident)) +geom_boxplot()+theme_bw() +coord_flip() #可视化横放且去掉灰色背景
#DIY可视化 #箱子太宽不太好看,喜欢“苗条”的 ggplot(c,aes(orig.ident,LYZ,fill=orig.ident)) +geom_boxplot(notch = F,width=0.5,alpha=0.8) +theme_bw() +coord_flip()
#DIY可视化 #箱子不好看,想换成小提琴#可视化的本质其实就是数据ggplot(c,aes(orig.ident,LYZ,fill=orig.ident)) +geom_violin(width=0.5,alpha=0.8) +theme_bw() +coord_flip()
#DIY可视化 #颜色不好看,可以自己选吗?#调取调色包install.packages("RColorBrewer") library("RColorBrewer")
#查看颜色组合display.brewer.all(colorblindFriendly =TRUE)      # Show allcolor palettes#选择合适的颜色组合 ggplot(c,aes(orig.ident,LYZ,fill=orig.ident)) + scale_fill_brewer(palette ="Blues")+ geom_violin(width=0.5,alpha=0.8) + theme_bw() +coord_flip() #注意:scale_fill_brewer函数用于箱线图、条形图等各种框图 #scale_color_brewer函数用于行和点
晨曦解读
绘制出来了冷酷感十足的图~
是不是对于可视化感觉到很有意思呢
咱们就像是粉刷匠,图在咱们手中自由变换,这就是我们前段时间学习所带来的成效
鉴于大家对于这类数据可视化很感兴趣,后期也会以数据分析联合可视化来帮助大家快速提高
下一期依旧是这个数据,咱们来看看还有什么可视化可以展现
箱线图还可以怎么修改让其更加美观、时尚呢?!
我是晨曦,我们下期见~
主页回复“晨曦可视化02,即可获得本次推文的所有示例数据以及代码哦~
晨曦单细胞笔记系列传送门
END

撰文丨晨   曦
排版丨四金兄
主编丨小雪球
欢迎大家关注解螺旋生信频道-挑圈联靠公号~
继续阅读
阅读原文