- 介绍ggplot2包
- 使用形状、颜色和尺寸来对多元数据进行可视化
- 用刻面图比较各组
- 自定义ggplot2图
19.1 R中的四种图形系统
- 基础
- grid
- lattice
- ggplot2(用的较多)
- gghub
需要的R包
- ggpolt2
- gridExtra(可以拼图)
- car
19.2 ggplot2介绍
library(ggplot2)ggplot(data=mtcars, aes(x=wt, y=mpg)) +geom_point() +labs(, x="Weight", y="Miles Per Gallon")
ggplot()初始化图形并且指顶要用到的数据来源(mtcars)和变量(wt\mpg)。aes()函数的功能是指定每个变量扮演的角色(aes代表aesthetics,即如何用视觉形式呈现信息)。
- 变量wt的值映射到沿x轴的距离,变量mpg的值映射到沿y轴的距离。
- ggplot()函数设置图形但没有自己的视觉输出。使用一个或多个几何函数向图中添加了几何对象(简写为geom),包括点、线、条、箱线图和阴影区域。
- geom_point()函数在图形中画点,创建了一个散点图。labs()函数是可选的,可添加注释(包括轴标签和标题)。
library(ggplot2)ggplot(data=mtcars, aes(x=wt, y=mpg)) +geom_point(pch=17, color="blue", size=2) +geom_smooth(method="lm", color="red", linetype=2) +labs(, x="Weight", y="Miles Per Gallon")
- 选用geom_point()函数来设置点的形状为三角形(pch=17),点的大小加倍(size=2),并使颜色为蓝色(color="blue")。
- geom_smooth()函数增加了一条“平滑”曲线。这里需要线性拟合(method="lm"),并且产生一条红色(color="red")虚线(linetype=2),线条尺寸为1(size=1)。
- 默认情况下,平滑的曲线包括在95%的置信区间(较暗带)内。
ggplot2包提供了分组和小面化的方法,分组是再一个图形中显示两组或多组观察结果,小面化是指再单独并排的图形上显示观察组。ggplot2再定义组和面时使用因子(factor)
示例:
我们可以使用mtcars数据集来查看分组和面。首先,将am、vs和cyl变量转化为因子:
rm(list=ls())mtcars$am labels=c("Automatic", "Manual"))mtcars$vs labels=c("V-Engine", "Straight Engine"))mtcars$cyl #绘图library(ggplot2)ggplot(data=mtcars, aes(x=hp, y=mpg,shape=cyl, color=cyl)) +geom_point(size=3)+facet_grid(am~vs)+labs(, x="Horsepower", y="Miles Per Gallon")
包含变速箱类型(自动对手动)和发动机装置(V型发动机与直列式发动 机)每个组合的分离的散点图。每个点的颜色和形状表示该汽车发动机汽缸的数量。在本例中,am和vs是刻面变量,cyl是分组变量。
19.3 用几何函数指定图的类型
函数 | 添加 | 选项 |
---|---|---|
geom_bar() | 条形图 | color、fill、alpha |
geom_boxplot() | 箱线图 | color、fill、alpha、notch、width |
geom_density() | 密度图 | color、fill、alpha、linetype |
geom_histogram() | 直方图 | color、fill、alpha、linetype、binwidth |
geom_hline() | 水平线 | color、alpha、linetype、size |
geom_jitter() | 抖动点 | color、size、alpha、shape |
geom_line() | 线图 | colorvalpha、linetype、size |
geom_point() | 散点图 | color、alpha、shape、size |
geom_rug() | 地毯图 | color、side |
geom_smooth() | 拟合曲线 | method、formula、color、fill、linetype、size |
geom_text() | 文字注解 | 很多,参见函数的“帮助” |
geom_violin() | 小提琴图 | color、fill、alpha、linetype |
geom_vline() | 垂线 | color、alpha、linetype、size |
书中描述的大多数图形都可以使用表19-2中的几何函数创建
ggplot(singer, aes(x=voice.part, y=height)) + geom_boxplot()
选项 | 详述 |
---|---|
color | 对点、线和填充区域的边界进行着色 |
fill | 对填充区域着色,如条形和密度区域 |
alpha | 颜色的透明度,从0(完全透明)到1(不透明)。 |
linetype | 图案的线条(1=实线,2=虚线,3=点,4=点破折号,5=长破折号,6=双破折号) |
size | 点的尺寸和线的宽度 |
shape | 点的形状(和pch一样,0=开放的方形,1=开放的圆形,2=开放的三角形,等等) |
position | 绘制诸如条形图和点等对象的位置。对条形图来说,"dodge"将分组条形图并排,"stacked"堆叠分组条形图,"fill"垂直地堆叠分组条形图并规范其高度相等。对于点来说,"jitter"减少点重叠 |
binwidth | 直方图的宽度 |
notch | 表示方块图是否应为缺口(TRUE/FALSE) |
sides | 地毯图的安置("b"=底部,"l"=左部,"t"=顶部,"r"=右部,"bl"=左下部,等等) |
width | 箱线图的宽度 |
data(Salaries)#现在R好像内置了这一个数据集library(ggplot2)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(side="l", color="black")
图层的叠加是ggplot2的魅力所在
library(ggplot2)data(singer, package="lattice")ggplot(singer, aes(x=voice.part, y=height)) +geom_violin(fill="lightblue") +geom_boxplot(fill="lightgreen", width=.2)
19.4 分组
为了理解数据,在一个图中画出两个或更多组的观察值通常是很有帮助的。在R中,组通常用分类变量的水平(因子)来定义。
分组是通过ggplot2图将一个或多个带有诸如形状、颜色、填充、尺寸和线类型的视觉特征的分组变量来完成的。ggplot()
声明中的aes()
函数负责分配变量(图形的视觉特征),所以这是一个分配分组变量的自然的地方
以薪水为例子。变量包括变量包括rank(助理教授、副教授、教授)、sex(女性、男性)、yrs.since.phd(获得博士学位年数)、yrs.service(工龄)和salary(以美元计的九个月薪水)。
薪水和学术等级
data(Salaries, package="car")library(ggplot2)ggplot(data=Salaries, aes(x=salary, fill=rank)) +geom_density(alpha=.3)#密度曲线
在同一幅图中画出了三条密度曲线(每条曲线代表一个学术等级)并用不同的颜色来区分。填充的设置有些透明度(alpha),
博士学位获得年数和薪水
ggplot(Salaries, aes(x=yrs.since.phd, y=salary, color=rank,shape=sex)) + geom_point()
学术等级和性别
ggplot(Salaries, aes(x=rank, fill=sex)) +geom_bar(position="stack") + labs(stack"')ggplot(Salaries, aes(x=rank, fill=sex)) +geom_bar(position="dodge") + labs(dodge"')ggplot(Salaries, aes(x=rank, fill=sex)) +geom_bar(position="fill") + labs(fill"')
19.5 刻面
如果组在图中并排出现而不是重叠为单一的图形,关系就是清晰的。我们可以使用facet_wrap()
函数和facet_grid()
函数创建网格图形
语法 | 结果 |
---|---|
facet_wrap(~var,ncol=n) | 将每个var水平排列成n列的独立图 |
facet_wrap(~var,nrow=n) | 将每个var水平排列成n行的独立图 |
facet_grid(rowvar~colvar) | rowvar和colvar组合的独立图,其中rowvar表示行,colvar表示列 |
facet_grid(rowvar~.) | 每个rowvar水平的独立图,配置成一个单列 |
facet_grid(.~colvar) | 每个colvar水平的独立图,配置成一个单行 |
data(singer, package="lattice")library(ggplot2)ggplot(data=singer, aes(x=height)) +geom_histogram() +facet_wrap(~voice.part, nrow=4)
19.6 添加光滑曲线
可以使用geom_smooth()
函数来添加一系列的平滑曲线和和置信区域。
选项 | 描述 |
---|---|
method= | 使用的平滑函数。允许的值包括lm、glm、smooth、rlm和gam,分别对应线性、广义线性、loess、健壮线性和广义相加模型。smooth是默认值 |
formula= | 在光滑函数中使用的公式。例子包括y~x(默认)y~log(x),y~poly(x,n)表示n次多项式拟合,y~ns(x,n)表示一个具有n个自由度的样条拟合 |
se | 绘制置信区间(TRUE/FALSE)。默认为TRUE |
level | 使用的置信区间水平(默认为95%) |
fullrange | 指定拟合应涵盖全图(TRUE)或仅仅是数据(FALSE)。默认为FALSE |
使用Salaries数据集,我们先检验博士毕业年数和薪水之间的关系。在这个例子中,我们可以使用带有95%置信区间的非参数光滑曲线(loess)
data(Salaries, package="car")library(ggplot2)ggplot(data=Salaries, aes(x=yrs.since.phd, y=salary)) +geom_smooth() + geom_point()
ggplot(data=Salaries, aes(x=yrs.since.phd, y=salary,linetype=sex, shape=sex, color=sex)) +geom_smooth(method=lm, formula=y~poly(x,2),se=FALSE, size=1) +geom_point(size=2)
按照性别来拟合一个二次多项式回归(一个弯曲)
19.7 修改ggplot2图形的外观
19.7.1 坐标轴
ggplot2包会在创建图时自动创建刻度线、刻度标记标签和坐标轴标签。它们往往看起来不错,但是有时我们需要在更大程度上控制它们的外观。
函数 | 选项 |
---|---|
scale_x_continuous()和scale_y_continuous() | breaks=指定刻度标记,labels=指定刻度标记标签,limits=控制要展示的值的范围 |
scale_x_discrete()和scale_y_discrete() | breaks=对因子的水平进行放置和排序,labels=指定这些水平的标签,limits=表示哪些水平应该展示 |
coord_flip() | 颠倒x轴和y轴 |
data(Salaries,package="car")library(ggplot2)ggplot(data=Salaries, aes(x=rank, y=salary, fill=sex)) +geom_boxplot() +scale_x_discrete(breaks=c("AsstProf", "AssocProf", "Prof"),labels=c("Assistant\nProfessor","Associate\nProfessor","Full\nProfessor")) +scale_y_continuous(breaks=c(50000, 100000, 150000, 200000),labels=c("$50K", "$100K", "$150K", "$200K")) +labs(, x="", y="")
19.7.2 图例
有些时候我们需要对图例进行自定义
标题位置theme()
中的legend.position"
可能的值有"left"、"top"、"right"(默认值)和"bottom",也可以再图中给定的位置指定一个二元素向量
data(Salaries,package="car")library(ggplot2)ggplot(data=Salaries, aes(x=rank, y=salary, fill=sex)) + geom_boxplot() + scale_x_discrete(breaks=c("AsstProf", "AssocProf", "Prof"), labels=c("Assistant\nProfessor", "Associate\nProfessor", "Full\nProfessor")) + scale_y_continuous(breaks=c(50000, 100000, 150000, 200000), labels=c("$50K", "$100K", "$150K", "$200K")) + labs(, x="", y="", fill="Gender") + theme(legend.position=c(.1,.8))#图例的左上角是分别距离左侧边缘10%和底部边缘80%的部分
19.7.3 标尺
ggplot2包使用标尺把数据空间的观察值映射到可视化的空间中,可以应用于连续的变量以及离散的变量
ggplot(mtcars, aes(x=wt, y=mpg, size=disp)) +geom_point(shape=21, color="black", fill="cornsilk") +labs(x="Weight", y="Miles Per Gallon",, size="Engine\nDisplacement")
aes()函数的参数size=disp生成连续型变量disp(发动机排量)的标尺,并使用它来控制点的尺寸。结果参见如图所示的气泡图。从该图中可以看出汽车里程随重量和发动机排量的降低而降低。
在这个离散的例子中,可以使用标尺将带有因子水平的视觉线索(如颜色、形状、线条类型、尺寸和透明度)关联起来。
data(Salaries, package="car")ggplot(data=Salaries, aes(x=yrs.since.phd, y=salary, color=rank)) +scale_color_manual(values=c("orange", "olivedrab", "navy")) +geom_point(size=2)#设定各个组别的颜色
19.7.4 主题
theme()
函数中的选项可以让我们调整字体、背景、颜色和网格线等。主题可以使用一次,也可以保存起来应用到多个图中。
data(Salaries, package="car")library(ggplot2)mytheme axis.title=element_text(face="bold.italic",size=10, color="brown"),axis.text=element_text(face="bold", size=9,color="darkblue"),panel.background=element_rect(fill="white",color="darkblue"),panel.grid.major.y=element_line(color="grey",linetype=1),panel.grid.minor.y=element_line(color="grey",linetype=2),panel.grid.minor.x=element_blank(),legend.position="top")# 设定主题ggplot(Salaries, aes(x=rank, y=salary, fill=sex)) +geom_boxplot() +labs(, x="Rank", y="Salary") +mytheme
主题mytheme
指定了图的标题应该为粗斜体的棕色14号字。轴的标题为粗斜体的棕色10号字。坐标轴标签应为加粗的深蓝色9号字。画图区域有白色的填充和深蓝色的边框。主水平网格应该是灰色的实线,次水平网格应该是灰色的虚线;垂直网格不输出;图例展示在图的顶部。theme()
函数给了我们把控最后图形的控制权。可以参考help(theme)
来查看更多关于选项的信息。
19.7.5 多重图
我们使用图形参数mfrow
和基本函数layout()
把两个或更多的基本图放到单个图形中。同样,这种方法在ggplot2包中不适用。将多个ggplot2包的图形放到单个图形中最简单的方式是使用gridExtra包中的grid.arrange()函数。
19.8 保存图形
我们可以使用1.3.4节讨论的标准方法来保存由ggplot2创建的图形,但是ggsave()
函数能更方便地保存它。它的选项包括保存哪幅图形,保存在哪里和以什么形式保存。
myplot ggsave(file="mygraph.png", plot=myplot, width=5, height=4)
如果忽略plot=选项,最近创建的图形会被保存。
ggplot(data=mtcars, aes(x=mpg)) + geom_histogram()ggsave(file="mygraph.pdf")