ggplot2语法
入门级绘图模版
属性设置
分面
几何对象
统计变换
位置调整
坐标系
以上是各种参数,需要的时候用一下就可以。
1.入门级绘图模板
ggplot(data = <DATA>)+
<GEOM_FUNCTION>(mapping =aes(<MAPPINGS>))
< >
:里面的内容是模版,使用时需要替换掉。
<GEOM_FUNCTION>
:为画图函数,可以使用不同类型的函数图如:点图 geom_point,箱线图geom_boxplot等。
<MAPPINGS>
:画图的参数如横、纵坐标,图形映射等属性。
ggplot(data = iris)+
geom_point(mapping = aes(x = Sepal.Length,
y = Petal.Length))
##iris替换<DATA>,geom_point替换<GEOM_FUNCTION>,<MAPPINGS>为映射:x,y为横纵坐标。
入门级绘图模版只需要:作图数据、横纵坐标(只需要填到相应位置)
ggplot的语法特殊性:用
+
连接,一般放在行末,换行代码有缩进;不允许加引号,不用
$
,失去tab键补全的权利。好处是代码易读,缺点是没有办法自动补齐。
2.属性设置(颜色、大小、透明度、点形状、线型等)
2.1手动设置
需要设置为有意义的值,把所有的点设置为同一颜色,直接指定是哪个颜色
属性 | 参数 |
---|---|
颜色 | color(red或是blue等) |
大小 | size(1到5mm) |
形状 | shape(有一套数字与之对应) |
透明度 | alpha(零点几或是百分之几) |
填充颜 | fill(有时候用不到) |
自行设置有一定的要求:
手动设置需要设为有意义的值
颜色:字符串,blue,red等
大小:单位mm(一般为1到5),写的时候不要单位。
形状:数字编号表示,有25种形状,如shape=1。
ggplot(data = iris) +
geom_point(mapping = aes(x = Sepal.Length,
y = Petal.Length),
color = "blue")
##注意属性的位置为color = "blue",属性前的东西当模版用。这个位置可以加shape=1等。
ggplot(data = iris) +
geom_point(mapping = aes(x = Sepal.Length, y = Petal.Length),
size = 5, # 点的大小5mm
alpha = 0.5, # 透明度 50%
shape = 8) # 点的形状
前面的属性设置和数据没有关系,如Sepal和Petal全部的点设置为蓝色。
设置一个与数据有关系的属性。
2.2 映射:按照数据框的某一列来定义图的某个属性
属性 | 参数 |
---|---|
x轴 | x |
y轴 | y |
颜色 | color |
大小 | size |
形状 | shape |
透明度 | alpha |
填充颜色 | fill |
ggplot(data = iris)+
geom_point(mapping = aes(x = Sepal.Length,
y = Petal.Length,
color = Species))
##color = Species,点的颜色不是全蓝,根据品种的颜色来分配不同的颜色,与数据是完全挂钩的。
根据数据框上Species这一列不同取值来分配颜色,颜色的种类与这一列的取值有关,用默认的就可以。
映射vs手动设置:color = Species与 color = "blue"的区别:
(1)所从属的函数不同,映射的color = Species是aes
里的参数,是列名
;color = "blue"是手动设置的geom_point的参数,是具体的颜色。
(2)映射的点颜色,根据数据框的某一列,列有多少种取值,对应多少种颜色,与数据挂钩;手动设置只有一种颜色。
映射:根据数据的某一列的值分配颜色。
手动设置:把图形设置为一个或是n个颜色,与数据无关。
2.3 Q1 能不能自行指定映射的具体颜色?
不要默认的颜色,有些杂志有指定的颜色分配:
ggplot(data = iris)+
geom_point(mapping = aes(x = Sepal.Length,
y = Petal.Length,
color = Species))+
scale_color_manual(values = c("blue","grey","red"))
##要求映射 color = Species);还有指定颜色scale_color_manual(values = c("blue","grey","red"),table列,看看有几个不同的取值,之后指定几种颜色。
##现成的语法,不允许乱改动。
##设定scale_color_manual(values = c("blue","grey","red")之前一定要有(指定)映射color = Species,
##除了scale_color_manual之外还有shape,scale_shape_manual,前提是要先指定映射shape=
映射:领导思维,只说按照某列分配颜色,不必须说具体是哪几种颜色。
自行指定映射的具体颜色(maual),values,不能少。
在谷歌里输入十六进制颜色代码,就可以找到对应的颜色编码。还有配色的R包,会提供一系列的颜色。
2.4 Q2 区分color和fill两个属性
在大部分情况下是用不到的,只是在一部分情况下用到。
区分color和fill两个属性:实心和空心形状。
只用color的情况
Q2-1 空心形状和实心形状都用color设置颜色:shape=
library(ggplot2)
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号,空心的例子
##两者用color来表示局就可以。单色图形,统一用color来表示,不用fill
- fill:双色的情况,25个数字表示25种形状,21到24就是双色的例子,有边框又有内部填充颜色的形状才设置两个参数:color和fill。color是管边框的,fill是管内心的。
- color为设置边框颜色,fill为填充图形颜色设置,color和fill是单独存在的,得看图形设置,两者有时候一起用,映射的对象是列名,color=列名,fill=列名。
Q2-2 既有边框又有内心的,才需要color和fill两个参数
ggplot(data = iris)+
geom_point(mapping = aes(x = Sepal.Length,
y = Petal.Length,
color = Species),
shape = 24,
fill = "black") #24号,双色的例子
3. 分面
分面:根据一种属性,切换为几张子图,如iris的Species列有3种取值,把每种取值分为一张子图。
(拼图:把Species的3个品种分别画成点图,然后拼到一起。首先把iris切分为3个数据:a1,a2,a3,其次需要用相同的代码对3个数据画图,最后把这三张图拼到一起。拆数据,分别画图,拼图)
分面只需要仅仅一句代码,分面根据数据框的某一列来把图分成若干张子图,Species有3个品种,就分为3张,如果有100个品种就不要分面。
3.1 单分面: facet_wrap(~ Species) ,分面的列Species。
ggplot(data = iris) +
geom_point(mapping = aes(x = Sepal.Length, y = Petal.Length)) +
facet_wrap(~ Species)
##facet_wrap(~ Species),分面的依据是Species
3.2 双分面: facet_grid(Group ~ Species)
iris里没有Group这一列,可以加上,iris$
Group=,但是比较麻烦,iris是一个公共的内置数据,这次对iris修改,下次使用iris时不一样,修改内置数据是一个非常坏的习惯。
dat = iris
##把iris的内容传递给dat,赋值给dat,之后对dat这个数据进行修改,不会同步到iris。
dat$Group = sample(letters[1:5],150,replace = T)
##dat$Group=,新增Group这一列;?sample的反馈:sample为随机取样的函数,letters[1:5],取前5个小写字母,内置数据不仅包括数据框还有向量,字母也是内置向量。150为取样的总体,replace = F为默认参数,不可放回,会报错,所以要设置replace = T,意思是可放回。
ggplot(data = dat) +
geom_point(mapping = aes(x = Sepal.Length, y = Petal.Length)) +
facet_grid(Group ~ Species)
满足分面的列首先得有重复值
以下是自己的思考与尝试:
分面依据的列,该列里面的数据类型是不是字符型?数值型可以吗?
可以的,自己探索,不知道有没有意义
dat = iris
dat$Group = sample(1:5,150,replace = T)
##sample(1:5,150,replace = T)处,1:3,纵分面更少
ggplot(data = dat) +
geom_point(mapping = aes(x = Sepal.Length, y = Petal.Length)) +
facet_grid(Group ~ Species)
dat = iris
dat$Group = sample(1:3,150,replace = T)
ggplot(data = dat) +
geom_point(mapping = aes(x = Sepal.Length, y = Petal.Length)) +
facet_grid(Group ~ Species)
横线内是自己的尝试,可能没有意义,出于好奇。
4.几何对象
什么是几何对象?
指的是一个以geom开头的函数,能画出来的所有图形。所有的点(或是方块)看成一个整体,也称为几何对象,也称为图层。
<GEOM_FUNCTION>
在入门级是被画点图geom_point()函数取代
以上图区别是geom_后的参数不一样,把geom_point()函数换了,要注意输入数据,是不是x和y就可以了,如多边形,不是只要x和y就可以的。画什么样的几何图直接到网上搜对应的函数,不需要把每个函数都背诵下来。
局部设置和全局设置
几何对象可以叠:如线图和点图的叠加
4.1 局部设置
ggplot(data = iris) +
geom_smooth(mapping = aes(x = Sepal.Length,
y = Petal.Length))+
geom_point(mapping = aes(x = Sepal.Length,
y = Petal.Length))
4.2 全局设置(简化代码)
ggplot(data = iris,mapping = aes(x = Sepal.Length, y = Petal.Length))+
geom_smooth()+
geom_point()
局部设置和全局设置的代码不一样,但是出的图是一样的。
4.3 代码区别:
- 第一个区别:
局部设置的代码里mapping写了两次,全局设置的mapping写在被当做模版处,
用ggplot画任何一张图,开头永远都是ggplot,后面可以用+
连接若干个geom_函数,开头一定是ggplot,mapping放的位置不一样,效果是一样的,全局设置可以起简化作用。
现在有color,只想给点加上颜色,不想给曲线加颜色,在点图函数里加上映射:aes()。
两个或是多个画图函数一起画图,单独想给某个图形设置颜色,在该图形的函数里加映射aes(color=或是fill=)。
ggplot(data = iris,mapping = aes(x = Sepal.Length, y = Petal.Length))+
geom_smooth()+
geom_point(mapping = aes(color=Species))
##Species不能使用自动补齐
- 第二个区别:映射
局部设置:仅对当前图层有效
全局设置:对所有图层有效
图层:geom_xxx()画出的单个几何对象。
练习题及代码:
### 1.尝试写出下图的代码
#数据是iris,x轴是Species,y轴是Sepal.Width,图是箱线图
ggplot(data = iris)+
geom_boxplot(mapping = aes(x=Species,
y=Sepal.Width))
ggplot(data = iris)+
geom_boxplot(mapping = aes(x=Species,
y=Sepal.Width,
fill=Species))
#color=Species
##fill=Species或是color=Species对比一下。color默认的颜色是黑色
### 2. 尝试在此图上叠加点图,
# 能发现什么问题?
ggplot(data = iris,mapping = aes(x=Species,y=Sepal.Width,fill=Species))+
geom_boxplot()+
geom_point()
##每个品种本来是有50个点,但是从图片上没有50个,因为点之间发生重合
5.统计变换
直方图:代码里只有指定x,没有指定y。
View(diamonds)
##diamonds为内置数据,5万多行,每一行记录一颗钻石的信息。
table(diamonds$cut)
##cut为切割质量,有5个等级,用直方图统计每个等级有多少颗钻石
ggplot(data = diamonds) +
geom_bar(mapping = aes(x = cut))
ggplot(data = diamonds) +
stat_count(mapping = aes(x = cut))
##以上两句代码画出来的图是一样的。不同在于代码geom_bar,把这一列画一个直方图;stat_count()为统计变换函数,它和这些几何对象有一定的对应关系,在这里的意思是,把这一列统计并且画图展示。一个是画图,一个是展示数据。
##代码里只有指定x,没有指定y,cut里面有5个取值,每个取值重复若干次,作为纵坐标,是计算得来,自动计算。
统计变换使用场景
5.1 不统计,数据直接做图
有时候拿到的直方图不是原始数据,而是统计好的,两列的数据:每个等级以及出现的次数,使用表中数据直接作图,不统计。
fre = as.data.frame(table(diamonds$cut))
fre
ggplot(data = fre) +
geom_bar(mapping = aes(x = Var1, y = Freq), stat = "identity")
##stat = "identity",意思是画只给的x和y,给啥画啥,不要统计。
使用场景2:不统计count,统计prop(比例)
有时候不需要统计数,而是统计比例:
ggplot(data = diamonds) +
geom_bar(mapping = aes(x = cut, y = ..prop.., group = 1))
##prop不是这个数据的某一列,所以写成这样..prop..为纵坐标,group = 1,把所有5万颗钻石当做一个整体,当作一个分组,如果不加group = 1,会把每个等级当作一组,各自占自己的100%。自己试了把group = 1去掉,没有比例,画出来为5根等长的柱形图。不习惯的是这个写法..prop..,大神就是大神,习惯就好。
6.位置调整
6.1 抖动的点图
有些数据很接近,画点图的时候,这些点会重叠,有两种方法
geom_point()加参数position,geom_jitter()函数是不要把横坐标限制严,在一个范围以内都属于该横坐标,范围宽一点,重合的点,横纵坐标错一下位,就不会发生重叠。
ggplot(data = mpg,mapping = aes(x = class,
y = hwy)) +
geom_boxplot()+
geom_point()
ggplot(data = mpg,mapping = aes(x = class,
y = hwy)) +
geom_boxplot()+
geom_jitter()
补充dotplot,点不重合,也不奔放
ggplot(data = mpg,mapping = aes(x = class,
y = hwy)) +
geom_boxplot()+
geom_dotplot(binaxis = "y",binwidth = .5,stackdir = "center")
6.2 堆叠直方图
直方图不是只能展示一个变量,可以展示两个变量,如数据集diamonds的两列:cut和clarity
ggplot(data = diamonds) +
geom_bar(mapping = aes(x = cut,fill=clarity))
##因为横纵坐标被占掉,对于clarity只能用颜色来表示
6.3 并列直方图
ggplot(data = diamonds) +
geom_bar(mapping = aes(x = cut, fill = clarity), position = "dodge")
并列直方图与堆叠直方图之间就是多了一个参数:position = "dodge",堆叠直方图展示总体数字以及各自的比例,并列直方图展示每个切割质量的clarity具体数值。
7.坐标系
已经画好一张图,不想牵一发而动全身,即不想改很多东西,而是想把坐标系转一转,横纵坐标的对调
7.1 翻转坐标系coord_flip()
ggplot(data = mpg, mapping = aes(x = class, y = hwy)) +
geom_boxplot() +
coord_flip()
7.2 极坐标系coord_polar()
在直方图的基础上,用柱子表示数字换成用伞形的面积表示数字
bar <- ggplot(data = diamonds) +
geom_bar(
mapping = aes(x = cut, fill = cut),
width = 1
) +
theme(aspect.ratio = 1) +
labs(x = NULL, y = NULL)
bar
bar + coord_flip()
bar + coord_polar()
8.ggplot图片背景的设置:
ggplot(data = iris,mapping = aes(x=Species,y=Sepal.Width,fill=Species))+
geom_boxplot()+
geom_point()
原图:
与背景相关的函数:theme_可能有9个
8.1 去灰色背景:加上 theme_bw()
ggplot(data = iris,mapping = aes(x=Species,y=Sepal.Width,fill=Species))+
geom_boxplot()+
geom_point()+
theme_bw()
8.2 横纵坐标的框框消失:theme_classic()
ggplot(data = iris,mapping = aes(x=Species,y=Sepal.Width,fill=Species))+
geom_boxplot()+
geom_point()+
theme_classic()
9.完整绘图模板
ggplot(data = <DATA>)+
<GEOM_FUNCTION>(mapping =aes(<MAPPINGS>))
,到这里为初级绘图模版
stat=<STAT >
,统计变换,不常用
position=<POSITION>
,位置关系,不常用
)+
<COORDINATE_FUNCTION>
+ 坐标系的变换
<FACET_FUNCTION>
分面
实战经验:R语言--ggplot2(基础不牢,地动山摇)
说明
以上内容是听生信技能树小洁老师的R语言线上课,根据自己的理解记录下来,小洁老师授课非常细心,对不同水平的同学都照顾到,并且补充很多技巧以及注意事项。设计的练习题,对知识的掌握和理解有辅助作用。
更多学习资料:
官网链接:
https://ggplot2.tidyverse.org/
《R Graphics Cookbook, 2nd edition》
《R for Data Science》
《ggplot2: Elegant Graphics for Data Analysis》