背景
ggplot2 包提供了一个基于全面而连贯的语法的绘图系统。它弥补了 R 中创建图形缺乏一致性的缺点,使得用户可以创建有创新性的、新颖的图形类型。ggplot2 是 R 语言绘图一个重要特性和优势。通过 ggplot2,只需少量的代码,就可以绘制出高质量的图形,满足出版需要。ggplot2 语法简介,逻辑清晰,功能强大,可以快速上手。在 R 语言中自成一派,目前也有越来越多的绘图包基于 ggplot2 进行二次开发,一般都是以“gg”开头,例如 ggpubr,ggtree,ggvis,ggtree,ggstatsplot 等。
图形语法
ggplot2 采用一套新的图形语法,其中 gg 就表示图形语法(grammar of graphic),理解了这套语法就理解了 ggplot2 绘图。
传统的 R 绘图称为“画家模式”,首先布局一块画布,然后在画布上添加点线面,而 ggplot2采用图层的方式,类似于“Photoshop”模式,通过累加不同的图层元素来绘图。ggplot2 的图层语法如下所示:
1、数据(Data)
ggplot2 绘图需要一个数据框,通过 data 选项添加。
代码语言:javascript复制ggplot(data=mtcars)
2、映射(Mapping)
映射是 ggplot2 中最重要的一个概念,将数据对应到不同的图形属性。通过 mapping 选项添加,然后使用 aes()函数,aes 来自于 aesthetics(美学,美的哲学),数据可以分别映射到轴与 y 轴,同时可以添加更多属性,例如点的大小,形状,颜色,透明度等属性,映射完成之后 ggplot 会自动分配图形显示比例。
代码语言:javascript复制ggplot(data=mtcars, mapping = aes(x=wt, y=mpg))
3、几何对象(Geometric)
映射完成之后,就可以直接出图,根据映射数据的特点展示不同的图,需要注意数据的类型,是离散型数据还是连续型数据,例如绘制条形图,箱线图等,必须包含离散数据。
代码语言:javascript复制ggplot(data=mtcars, mapping = aes(x=wt, y=mpg)) geom_point()
ggplot(data=mtcars, mapping = aes(x=wt, y=mpg,size=mpg)) geom_point()
mtcars$cyl <- as.factor(mtcars$cyl)
ggplot(data=mtcars, mapping = aes(x=wt, y=mpg,size=mpg,shape=cyl))
geom_point()
ggplot(data=mtcars, mapping = aes(x=wt, y=mpg,size=mpg,shape=cyl,color=cyl))
geom_point()
library(ggplot2)
mtcars$vs <- as.factor(mtcars$vs)
ggplot(data=mtcars,mapping=aes(x=wt,y=mpg,color=factor(cyl),
shape=vs))
geom_point()
ggplot(data=mtcars,mapping=aes(x=wt,y=mpg,color=mpg,
shape=vs))
geom_point()
iris
colnames(iris)
ggplot(data=iris,mapping = aes(x=Sepal.Length,y=Sepal.Width,
color = Species))
geom_point(size =6)
theme_bw()
4、标尺(Scale)
标尺用于重新调整默认的图形属性,例如修改坐标刻度,颜色属性等。
代码语言:javascript复制ggplot(data=mtcars, mapping = aes(x=wt, y=mpg,color=mpg))
geom_point()
scale_color_gradient(low = "orange",high = "red")
mtcars$cyl <- as.factor(mtcars$cyl)
ggplot(data=mtcars, mapping = aes(x=wt, y=mpg,color=cyl))
geom_point()
scale_color_discrete(type = rainbow(3))
ggplot(data=mtcars, mapping = aes(x=wt, y=mpg,color=cyl))
geom_point()
scale_color_discrete(type = c('blue','orange','red'))
5、统计变换(Statistics)
代码语言:javascript复制ggplot(data=mtcars, mapping = aes(x=wt, y=mpg)) geom_point()
stat_smooth( method = 'loess' ,formula = 'y ~ x')
6、坐标(Coordinate)
坐标系统控制坐标轴,可以修改坐标轴范围,转换 xy 轴,笛卡尔坐标和极坐标转换。
代码语言:javascript复制ggplot(data=mtcars, mapping = aes(x=wt, y=mpg)) geom_point() coord_flip()
ggplot(data=mtcars, mapping = aes(x=wt, y=mpg)) geom_point() coord_polar()
7、图层(Layer)
类似于 Photoshop 的图层概念,直接使用 号即可实现图层叠加,一张图内展示更多内容。
代码语言:javascript复制ggplot(data=mtcars, mapping = aes(x=cyl, y=mpg)) geom_point() geom_boxplot()
ggplot(data=mtcars, mapping = aes(x=cyl, y=mpg)) geom_boxplot() geom_point()
后画的图层就在最上方,上图代码中很好展示了点是否被箱子覆盖。
8、面(Facet)
代码语言:javascript复制ggplot(data=mtcars, mapping = aes(x=wt, y=mpg)) geom_point() facet_grid(. ~ cyl)
ggplot(data=mtcars, mapping = aes(x=wt, y=mpg)) geom_point() facet_grid(cyl ~ .)
ggplot(data=mtcars, mapping = aes(x=wt, y=mpg)) geom_point() facet_wrap(. ~ cyl)
ggplot(data=mtcars, mapping = aes(x=wt, y=mpg)) geom_point() facet_wrap(cyl ~ .)
9、主题(Theme)
主题是一些元素默认设置构成的整体,ggplot2 默认的主题是其简单设置就可以生成高质量的图片,无需进行更多修改。此外,除了默认的主题(theme_gray)之外,ggplot2 还内置了许多其他的主题,可以快速切换,类似于手机系统一键更换主题一样容易。
代码语言:javascript复制ggplot(data=mtcars, mapping = aes(x=wt, y=mpg)) geom_point() theme_bw()
ggplot(data=mtcars, mapping = aes(x=wt, y=mpg)) geom_point() theme_dark()
ggplot(data=mtcars, mapping = aes(x=wt, y=mpg)) geom_point() theme_gray()
ggplot(data=mtcars, mapping = aes(x=wt, y=mpg)) geom_point() theme_light()
10、保存绘图
代码语言:javascript复制p <- ggplot(data=mtcars, mapping = aes(x=wt, y=mpg)) geom_point() theme_bw()
ggsave(filename = "mtcars.pdf",plot = p)
写在最后:有时间我们会努力更新的。大家互动交流可以前去论坛,地址在下面,复制去浏览器即可访问,弥补下公众号没有留言功能的缺憾。
代码语言:javascript复制bioinfoer.com
有些板块也可以预设为大家日常趣事的分享等,欢迎大家来提建议。