初探R语言绘图工具包--ggplot2

一、在R中安装ggplot2

1
install.packages("ggplot2")

二、ggplot2全局总览

ggplot2中的函数可以分为以下几大类:

1
2
3
4
5
6
7
element_  主题设置中的参数,调整细节
geom_ 主要作图函数,区分作图类型,比如是柱状图还是点图
scale_ 修改默认颜色等设置
stat_ 数据变换
theme_ 主题设置
coord_ 坐标轴转换
facet_ 分面作图,分组作图,放在不同页面上

三、gplot2的绘图步骤

3.1.初始化一个ggplot对象

  • 在绘制图形之前,需要使用ggplot函数(ggplot())初始化一个ggplot对象,可以理解为创建一块画布,接下来的一切工作都在这块画布上进行。官网给出的初始化代码是这样的:

    1
    ggplot(data = NULL, mapping = aes(), ..., environment = parent.frame())
  • 我们主要修改的是前两个参数,即datamapping

    data:你的数据框;

    mapping:用于绘图的变量,通俗来说就是x轴和y轴所代表的变量。

3.2 画一个散点图

  • 上一步已经创建了一块画布,现在就在画布上画一幅散点图:
    1
    2
    3
    4
    5
    #首先生成自变量x和因变量y
    x = factor(rep(letters[1:3], each = 10))#使用了rep函数生成因子a,b,c各10个
    y=rnorm(30)
    #然后将x和y组合成数据框,命名为df
    df=data.frame(x,y)
1
2
#现在可以画图了
ggplot(df, aes(x, y))
  • 画出来是这样的:


上面什么都没显示,只是一张空画布,这是因为并没有指定绘图格式(此时我们仅仅告诉了系统要画一幅画,并且所用数据为df这个数据框,x和y轴分别是x,y这两个变量,但是并没有具体讲要怎么画,画什么)

现在加上一层geom_point(),用于绘制散点图。这样绘图代码就变成了这个样子:

1
ggplot(df, aes(x, y)) +geom_point()

画出来的图像是这样的:



这次的结果和预想的就一样了。

3.3 尝试再添加一层

  • 在上面已经绘制了散点图的画布上再添加一层(注意是在同一张画布上操作):
1
2
3
4
5
6
7
8
#生成新的数据框ds,本行代码具体解释见下方【注释】
ds=do.call(rbind, lapply(split(df, df$x), function(d) {
data.frame(mean = mean(d$y), sd = sd(d$y), x = d$x)
}))
#可以画图啦
ggplot(df, aes(x, y)) +
geom_point() +
geom_point(data = ds, aes(y = mean), colour = 'red', size = 3)



【注释】

在生成ds时,用到了do.call()lapply()

先看lapply,它有两个参数,一个是split(df, df$x),另一个是匿名函数function(d)

1
2
3
function(d) {
data.frame(mean = mean(d$y), sd = sd(d$y), x = d$x)
}

split(df, df$x)的作用是将df这个数据框按照x列的取值不同分为3部分(因为x可取a,b,c):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
> split(df, df$x)
$a
x y
1 a -2.0918912
2 a -2.2824544
3 a 0.1987116
4 a -1.7204838
5 a 1.6355444
6 a -0.3358297
7 a 1.0307883
8 a -0.6142356
9 a -0.7293628
10 a -0.4128977

$b
x y
11 b 1.99706479
12 b 0.15562728
13 b -1.58374617
14 b 0.41752970
15 b 0.53430369
16 b 0.06285871
17 b -0.53760935
18 b 1.35068305
19 b -0.91601690
20 b 2.43169420

$c
x y
21 c 1.4711247
22 c 0.6199710
23 c 0.9347642
24 c 1.1362680
25 c -1.5553590
26 c -0.5053353
27 c 0.8935274
28 c -0.1612125
29 c -0.3308873
30 c -0.2126249

通过lapply函数,对上面的这3个子数据框分别用匿名函数进行作用,得到的结果是这样子的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
 > lapply(split(df,df$x),function(d){data.frame(mean=mean(d$y),sd=sd(d$y),x=d$x)})
$a
mean sd x
1 -0.5322111 1.277268 a
2 -0.5322111 1.277268 a
3 -0.5322111 1.277268 a
4 -0.5322111 1.277268 a
5 -0.5322111 1.277268 a
6 -0.5322111 1.277268 a
7 -0.5322111 1.277268 a
8 -0.5322111 1.277268 a
9 -0.5322111 1.277268 a
10 -0.5322111 1.277268 a

$b
mean sd x
1 0.3912389 1.261367 b
2 0.3912389 1.261367 b
3 0.3912389 1.261367 b
4 0.3912389 1.261367 b
5 0.3912389 1.261367 b
6 0.3912389 1.261367 b
7 0.3912389 1.261367 b
8 0.3912389 1.261367 b
9 0.3912389 1.261367 b
10 0.3912389 1.261367 b

$c
mean sd x
1 0.2290236 0.9334836 c
2 0.2290236 0.9334836 c
3 0.2290236 0.9334836 c
4 0.2290236 0.9334836 c
5 0.2290236 0.9334836 c
6 0.2290236 0.9334836 c
7 0.2290236 0.9334836 c
8 0.2290236 0.9334836 c
9 0.2290236 0.9334836 c
10 0.2290236 0.9334836 c

最后在最外层用do.call()将上面的3个子数据框按行合并(使用rbind()),就得到了最终的数据框ds了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
> ds
mean sd x
a.1 -0.5322111 1.2772680 a
a.2 -0.5322111 1.2772680 a
a.3 -0.5322111 1.2772680 a
a.4 -0.5322111 1.2772680 a
a.5 -0.5322111 1.2772680 a
a.6 -0.5322111 1.2772680 a
a.7 -0.5322111 1.2772680 a
a.8 -0.5322111 1.2772680 a
a.9 -0.5322111 1.2772680 a
a.10 -0.5322111 1.2772680 a
b.1 0.3912389 1.2613668 b
b.2 0.3912389 1.2613668 b
b.3 0.3912389 1.2613668 b
b.4 0.3912389 1.2613668 b
b.5 0.3912389 1.2613668 b
b.6 0.3912389 1.2613668 b
b.7 0.3912389 1.2613668 b
b.8 0.3912389 1.2613668 b
b.9 0.3912389 1.2613668 b
b.10 0.3912389 1.2613668 b
c.1 0.2290236 0.9334836 c
c.2 0.2290236 0.9334836 c
c.3 0.2290236 0.9334836 c
c.4 0.2290236 0.9334836 c
c.5 0.2290236 0.9334836 c
c.6 0.2290236 0.9334836 c
c.7 0.2290236 0.9334836 c
c.8 0.2290236 0.9334836 c
c.9 0.2290236 0.9334836 c
c.10 0.2290236 0.9334836 c
凡希 wechat
喜欢所以热爱,坚持干货分享,欢迎订阅我的微信公众号
呐,请我吃辣条