之前学习的绘图方法是基于R的基础绘图系统。在R中一共有四种作图系统,分别为base(之前学的)、grid、lattice,以及ggplot2。其中ggplot2包的目标是提供一个全面的、基于语法的,连贯一致的图形生成系统,允许用户创建新颖的、有创新性的数据可视化图形。关于另外两种的介绍,见p402。
一、预准备
1、安装加载包
不像基础绘图方法可以直接使用,ggplot2包第一次使用要安装、加载。
install.packages("ggplot2")
library(ggplot2)
2、加载实验数据
(1)mtcars数据集包括32辆车的详细信息。
data(mtcars)
(2)singer数据集来自lattice包,包括某合唱团的身高与声音变量
data(singer, package="lattice")
#lattice包已在基础安装里
(3)Salaries数据集来自carData包(教材说是来自car包,可能是最近移动了),其包含了大学教授的收入信息,以及其它相关因素(级别、性别)。
install.packages("carData")
data(Salaries, package="carData")
二、基础用法
一个简单例子
ggplot(mtcars, aes(x=wt, y=mpg)) +
geom_point() +
labs(title="Automobile Data", x="Weight", y="Miles Per Gallon")
如上一个简单的ggplot绘图包括主要有以下三方面内容,用加号(+)相连组成的:
1、ggplot()函数
:用于交代绘图的数据来源,并指定要使用的变量信息。其中的aes()即用来指定绘图涉及到的变量,及每个变量扮演的角色,有时也包括分组信息。
2、geom_ 几何函数
:指明视觉呈现方式(在我理解就是绘图类型);一张图里可以有多个几何函数呈现,即使用多个geom类型函数。
3、lab()函数
:主要用于添加注释信息(标题等)。部分常用参数如下
-
title =
添加主标题;subtitle =
添加副标题,位于主标题下面,字体更小。 -
caption =
在图形右下角添加文本,常用于描述数据来源。 -
x =
与y =
修改坐标轴标题,colour =
修改图例标题
ggplot()函数中的变量选择要根据自己想要绘制什么样的图来研究什么样的变量关系来决定。
补充:关于ggplot的绘图变量交代也可放在每个具体的绘图函数中,ggplot()仅交代下数据来源。比如
ggplot(data = mpg) +
geom_point(aes(x = displ, y = hwy))
# 如果只使用ggplot(data = mpg)只会得到灰色背景
三、关于geom函数
1、geom类型
目前一共有37个几何函数可供使用,教材中列了常见的13种以及所涉及到的参数选项(p407)。比如
-
geom_bar()
表示条形图,涉及选项有color、fill、alpha; -
geom_boxplot()
表示箱线图,涉及选项有color、fill、alpha、notch、width; -
geom_histogram()
表示直方图,涉及选项有color、fill、alpha、linetype、binwidth; -
geom_point()
表示散点图,涉及选项有color、alpha、shape、size; -
geom_rug()
表示地毯图,涉及选项有color、size。
2、常见选项(详见p408)
- fill 用于设置填充区域颜色;
- color 用于设置点、线,边界的颜色;
- alpha 设置颜色透明度,1不透明;0透明;
- linetype 设置线条类型;
- shape 设置点的形状;
- position 参数对于点图来说 jitter 减少点重叠;对条形图而言有 dodge、stacked、fill三种模式(具体在例子中说明)。
例图:三图综合
ggplot(Salaries, aes(x=rank, y=salary)) +
geom_boxplot(fill="cornflowerblue",
color="black", notch=TRUE)+
geom_point(position="jitter", color="blue", alpha=.5)+
geom_rug(sides="l", color="black")
如图为箱线图、点图,地毯图的混合图。
(1)对箱线图设置了填充颜色、边界和点的颜色,以及方块缺口;
(2)对点图设置了随机抖动(否则点就排成一列,难以观察)、点的颜色、点的透明度;
(3)对地毯图设置了出现位置,以及线的颜色。
举例-1:geom_smooth添加光滑曲线
除了上述提到的几何函数类型,还有一种比较常见的函数:为散点图添加平滑曲线geom_smooth。其涉及到的参数有--(详见p416)一般直接选默认参数。
-
method=
设置使用的平滑函数,默认为smooth的非参数光滑曲线;此外还可选lm(线性)、glm(广义线性)、rlm(稳健线性)、gam(广义相加)。 -
formula=
设置光滑函数公式,默认为y~x;如果是n次多项式,y~poly(x,n) -
se
设置置信区间,默认TRUE。 -
level
设置置信水平,默认95%
ggplot(data=Salaries, aes(x=yrs.since.phd, y=salary)) +
geom_smooth() + geom_point()
#直接使用默认参数
- 如上图,散点的线性关系不是很明显。因此可以拟合一个二次多项式的回归的有参模型。
ggplot(data=Salaries, aes(x=yrs.since.phd, y=salary)) +
geom_smooth(method=lm, formula=y~poly(x,2),
se=FALSE, size=1) + #设置多项式拟合,并取消了置信区间
geom_point(size=2)
四、分组与刻面
绘图时,若存在一个/多个分类变量可以就分组关系将图分类,以研究分类变量对数据的分布影响。例如将全校的成绩按各个班级角度来看。
1、分组
(1)特征:不同组的分类变量绘制在一张图里。
(2)书写格式:在aes()函数中指明用来区分分类变量的方法即可(比如颜色、符号形状等);比如下例中的color=rank
,左边为区分方式(颜色)、右边为分类变量(等级)。其它的分组依据还有:size =
、alpha =
、shape =
ggplot(Salaries, aes(x=yrs.since.phd, y=salary, color=rank)) +
geom_point()
这里绘制毕业年数与收入的关系,并想研究学术级别对其分布的影响
补充1:分组颜色方案是ggplot2默认的,也可以选择ColorBrewer 提供的系列配色方案;或者直接自己自定义。例如下代码---
ggplot(Salaries, aes(x=yrs.since.phd, y=salary, color=rank)) +
geom_point() +
scale_color_brewer(palette = "Set1")
#scale_colour_manual(
#values = c(AsstProf = "red", AssocProf = "blue", Prof = "black")
)
补充2:二分类颜色
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy, color = displ < 5))
#依据displ变量是否大于5,分为两类颜色
- 接下来举一例:用性别分组的柱状图研究不同学术级别的人数,并以此来探究下之前提到的position的三种设置的区别。(绘图中用到了绘制多重图的方法--
grid.arrange()
的使用也是一个常用的技巧)
library(gridExtra)
p1 <- ggplot(Salaries, aes(x=rank, fill=sex)) +
geom_bar(position="stack") + labs(title='position="stack"')
p2 <- ggplot(Salaries, aes(x=rank, fill=sex)) +
geom_bar(position="dodge") + labs(title='position="dodge"')
p3 <- ggplot(Salaries, aes(x=rank, fill=sex)) +
geom_bar(position="fill") + labs(title='position="fill"')
grid.arrange(p1, p2, p3, ncol=3)
如下图,可看出:
(1)position="stack"
绘制堆叠分组条形图;
(2)position="dodge"
绘制分组条形图并排;
(3)position="fill"
绘制堆叠分组,高度相同,按比例解释。
2、刻面图
(1)特征:区别于上述分组图,刻面图是按分类因子分开绘制数张图(几个类别就画几张图)
(2)函数:刻面图有专门的函数绘制,有以下4种--
-
facet_wrap(~var,ncol=n)
设置多图排成n列; -
facet_wrap(~var,nrow=n)
设置多图排成n行;
data(singer, package="lattice")
library(ggplot2)
ggplot(data=singer, aes(x=height)) +
geom_histogram() +
facet_wrap(~voice.part, nrow=4)
#分成4行排列
如果想把多图排成一个单列/单行,以便于比较组间数据差异。(当然前面提到的连个函数也可以)
-
facet_grid(var~.)
设置排成单列 -
facet_grid(.~var)
设置排成单行
ggplot(data=singer, aes(x=height, fill=voice.part)) +
geom_density() +
facet_grid(voice.part~.)
#单列排布,利于比较观察
如果有两个分类变量var1、var2,分别有m、n类,可以用
facet_grid(var1~var2)
函数绘制m*n个刻面图。
五、自定义ggplot2图形的外观
1、坐标轴(p419)
主要针对两类坐标轴:类别型与连续型
- 以x轴为例分别为
scale_x_discrete()
、scale_x_continuous()
; - 主要涉及两个参数
breaks=
、labels=
-
scale_x_discrete()
、scale_y_discrete()
可用于修改x轴或y轴的刻度单位值(break=);修改刻度标签(labels=)
关于后者labels= 比较好理解,就是我们看到坐标轴上的注释性刻度标签;
关于前者breaks=,是实际绘图的参照轴刻度值。对于连续型变量,一般是从小到大的数值型向量;对于类别型变量,一般对应实际数据分类因子字符向量。具体见下例
(1)原图
ggplot(data=Salaries, aes(x=rank, y=salary, fill=sex)) +
geom_boxplot() +
labs(title="Faculty Salary by Rank and Sex", x="", y="")
#ggplot2默认情况下会数据添加标签、图例等。
(2)自定义标签
ggplot(data=Salaries, aes(x=rank, y=salary, fill=sex)) +
geom_boxplot() +
scale_x_discrete(breaks=c("AsstProf", "AssocProf", "Prof"),
labels=c("Assistant\na",
"Associate\nb",
"Full\nc")) +
scale_y_continuous(breaks=c(50000, 100000, 150000, 200000),
labels=c("$50K", "$100K", "$150K", "$200K")) +
labs(title="Faculty Salary by Rank and Sex", x="", y="")
注意如果想改变类别型变量在x轴上的分布次序,那么需要修改原数据该列的因子顺序,对应上例,即
Salaries$rank=factor(Salaries$rank,levels = c("Prof","AsstProf", "AssocProf"))
,再执行上述操作,即可改变箱图的顺序。
补充:交换x、y轴
+ coord_flip()
2、图例
自动生成的图例都可以满足大多数情况的需求。一般修改的话,即修改图例的标题与位置。
(1)图例标题在labs()
函数的fill选项修改。本例中把sex改为了Gender。
(2)图例位置通过theme()
函数修改。本例中图例位于距y轴10%,距x轴80%。
ggplot(data=Salaries, aes(x=rank, y=salary, fill=sex)) +
geom_boxplot() +
labs(title="Faculty Salary by Rank and Gender",
x="", y="", fill="Gender") +
theme(legend.position=c(.1,.8))
通过指定比例坐标信息,可以将图例摆放在绘图区域的特定位置。而ggplot默认将图例放在图的右侧(四周外面)legend.position="left/top/bottom/right"
legend.positon = "none"
则会取消图例。
3、主题
-
theme_*()族函数,来定制图形中的非数据元素
- 如下示例对比
g1 <- ggplot(mpg, aes(displ, hwy)) +
geom_point(aes(color = class))
g2 <- ggplot(mpg, aes(displ, hwy)) +
geom_point(aes(color = class)) +
theme_classic()
library(gridExtra)
grid.arrange(g1, g2, ncol=2)
4、保存图形
ggsave()
函数
(1)保存指定图形(plot、width、height)
myplot1 <- ggplot(data=Salaries, aes(x=rank, y=salary, fill=sex)) +
geom_boxplot() +
labs(title="Faculty Salary by Rank and Gender",x="", y="")
ggsave(file="my01.png", plot=myplot1, width=5, height=4)
#保存尺寸为5英寸×4英寸,即12.7cm×10.2cm
(2)保存刚刚得到的图形
ggplot(data=Salaries, aes(x=rank, y=salary, fill=sex)) +
geom_boxplot() +
labs(title="Faculty Salary by Rank and Gender",x="", y="")
ggsave(file="my02.png")
此外教材中还有三维气泡图,如何给分组观测自定义颜色,以及主题的设置,详见p422。以上是关于ggplot2函数基础知识的学习。ggplot2的功能是很强大的,后续有机会再进行深入的探索与学习。
寒假关于R语言的学习可能就暂时到这一章节了,之后要刷学校的网课了,盼望能够早日开学吧。
参考教材《R语言实战(第2版)》