1.R的四种主要图形系统
- Basic,由Ross Ihaka编写,每个R都默认安装
- grid,由Paul Murrell(2011)编写,通过grid包安装执行
- lattice,由Deepayan Sarkar(2008)编写,总的来说,网格图形显示一个变量的分布或是变量之间的关系,分别显示一个或多个变量的各个水平。lattice包基于grid包创建,在多元数据的可视化功能方面已经远超Cleveland的原始方法。它为R提供了一种全面的、创建统计图形的备选系统。
- ggplot2包由Hadley Wickham(2009a)编写,提供了一种基于Wilkinson(2005)所述图形语法的图形系统
2. ggplot
在ggplot2中,图是采用串联起来
号函数创建的。每个函数修改属于自己的部分。
2.1 ggplot()函数
ggplot(data = NULL, mapping = aes(), ..., environment = parent.frame())
- ggplot指定要绘制的数据源和变量,但没有自己的视觉输出
- aes()函数的功能是指定每个变量扮演的角色(aes代表aesthetics,即如何用视觉形式呈现信息)
2.2 geom()函数
geom()几何函数指定变量如何在视觉上进行表示(使用点、条、线和阴影区),目前,有37个几何函数可供使用
2.2.1 几何函数geom()的主要类型
函数 | 添加 | 选项 |
---|---|---|
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_vline() | 垂线 | 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, alpha, linetype, size |
…… |
2.2.2 几何函数geom()的主要参数
选项 | 描述 |
---|---|
color | 对点,线和填充区域的边界进行着色 |
fill | 对填充区域进行着色,如条形或者密度区域 |
alpha | 颜色的透明度,从0(完全透明)到1(不透明) |
linetype | 图案的线条,1=实线,2=虚线,3=点,4=点破折号,5=长破折号,6=双破折号 |
size | 点的尺寸和线的宽度 |
shape | 点的形状,同基础画图的pch |
position | 绘制注入条形图和点对象的位置;对于条形图,“dodge”将分组条形图并排,“stacked”堆叠分组条形图,“fill”垂直地堆叠分组条形图并规范其高度相等;对于点来说,“jitter” 减少点的重叠 |
binwidth | 直方图的宽度 |
notch | 表示方块图是否应为缺口(FALSE/TRUE) |
sides | 地毯图的安置,“b”=底部,“l”=左侧,“t”=顶部,“r”=右侧,“bl”=坐下侧 |
width | 箱线图的宽度 |
例如:
ggplot(mtcars,aes(x=wt,y=mpg)) + geom_point()
2.3 几何图形的堆叠
library(ggplot2)
data(singer, package="lattice")
ggplot(singer, aes(x=voice.part, y=height)) +
geom_violin(fill="lightblue") +
geom_boxplot(fill="lightgreen", width=.2)
2.4 分组
在R中,组通常用分类变量的水平(因子)来定义。分组是通过ggplot2图将一个或多个带有诸如形状、颜色、填充、尺寸和线类型的视觉特征的分组变量来完成的。
- ggplot()声明中的aes()函数负责分配变量(图形的视觉特征)
- 变量应该设在aes()函数内,分配常数应该在aes()函数外,变量在aes()内外的效果是完全不同的
- 需要注意的是,分组可能是连续变量,在指定颜色时可能会报错,因此需要先转换为分类因子
## 初次使用需install.packas("car")
library(car)
## 加载Salaries可能会报错,但是不影响出图
data(Salaries, package="car")
library(ggplot2)
## aes()指定分组
## 填充设置透明度(alpha),使重叠曲线不掩盖彼此
ggplot(data=Salaries, aes(x=salary, fill=rank)) +
geom_density(alpha=.3)
2.5 刻面
- 基础画图的mfcol,mfrow,layout不适用与ggplot
- 可以使用facet_wrap()函数和facet_grid()函数创建网格图形(在ggplot2中也称刻面图)
语法 | 结果 |
---|---|
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)
2.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 |
- 注意:ggplot2包中含有大量统计函数来计算所需要的量,从而生产更多的可视化数据。通常情况下几何函数隐式地调用统计函数,我们不需要直接处理这些问题。例如geom_smooth()函数依赖于stat_smooth()函数来计算画出一个拟合曲线及其置信限所需的数量。在探索几何函数如何工作和哪些选项可供选择时,一定要检查这个函数及其相关统计函数。
library(car)
data(Salaries, package="car")
library(ggplot2)
ggplot(data=Salaries, aes(x=yrs.since.phd, y=salary)) +
geom_smooth() + geom_point()
2.7 修改ggplot2 图形的外观
- 基础函数使用par()函数或特定画图函数的图形参数来自定义基本函数。
但是改变基本图形参数对于ggplot2图形没有影响
2.7.1 坐标轴
- ggplot2包会在创建图时自动创建刻度线、刻度标记标签和坐标轴标签
- labs()函数可用来来添加标题并改变坐标轴标签
- 控制坐标轴及刻度线外观的函数
ggplot2的函数区分x轴和y轴,以及轴线是否代表一个连续或离散变量(因子)(连续:continuous,离散:discrete)。
| 函 数 | 选 项 |
| - | - |
| scale_x_continuous()和scale_y_continuous() | breaks=指定刻度标记,labels=指定刻度标记标签,limits=控制要展示的值的范围 |
| scale_x_discrete()和scale_y_discrete() | breaks=对因子的水平进行放置和排序,labels=指定这些水平的标签,limits=表示哪些水平应该展示 |
| coord_flip() | 颠倒x轴和y轴 |
library(car)
## 可能会报错没有‘Salaries’这个数据集,但不影响出图
data(Salaries,package="car")
library(ggplot2)
ggplot(data=Salaries, aes(x=rank, y=salary, fill=sex)) +
geom_boxplot() +
## 设置离散型变量x,x轴标签通过labels设置,“\n”为换行显示防止标签过长
scale_x_discrete(breaks=c("AsstProf", "AssocProf", "Prof"),
labels=c("Assistant\nProfessor",
"Associate\nProfessor",
"Full\nProfessor")) +
## 设置离散型变量y
scale_y_continuous(breaks=c(50000, 100000, 150000, 200000),
labels=c("$50K", "$100K", "$150K", "$200K")) +
## 标题设置为labs(),与轴标签“labels=”进行区分
labs(title="Faculty Salary by Rank and Sex", x="", y="")
2.7.2 图例
- ggplot2包能自动生成图例,而且在很多时候能够满足我们的需求;但是在其他时候,我们可能要对其进行自定义。$\color{red}{标题和位置}是最常用的定制特征。
- 当更改图例的标题时,必须考虑图例是否基于颜色、填充、尺寸、形状或它们的组合。通常情况下aes()函数分组会自动生成图例,我们可以通过更改分组变量,如将fill="mytitle"加到labs()函数中来改变标题。
- 标题的位置由theme()函数中的legend.position选项控制。可能的值包括"left"、"top"、"right"(默认值)和"bottom"。我们也可以在图中给定的位置指定一个二元素向量。
- 如果想删除图例,可以使用legend.position="none"
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(title="Faculty Salary by Rank and Gender",
x="", y="", fill="Gender") +
theme(legend.position=c(.1,.8))
2.7.3 标尺
ggplot2包使用标尺aes("size=")把数据空间的观察值映射到可视化的空间中。标尺既可以应用到连续的变量,也可以应用到离散的变量
可以使用标尺将带有因子水平的视觉线索(如颜色、形状、线条类型、
尺寸和透明度)关联起来
- 尺寸
## aes()函数的参数size=disp生成连续型变量disp(发动机排量)的标尺,并使用它来控制点的尺寸
ggplot(mtcars, aes(x=wt, y=mpg, size=disp)) +
geom_point(shape=21, color="black", fill="cornsilk") +
labs(x="Weight", y="Miles Per Gallon",
title="Bubble Chart", size="Engine\nDisplacement")
- 颜色
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)
可以通过scale_color_brewer()和scale_fill_brewer()函数来预先指定分得清的颜色集
为了得到可获得的颜色集,可以使用:
library(RColorBrewer)
display.brewer.all()
ggplot(data=Salaries, aes(x=yrs.since.phd, y=salary, color=rank)) +
scale_color_brewer(palette="Set1") + geom_point(size=2)
2.7.4 主题
theme()函数中的选项可以让我们调整字体、背景、颜色和网格线等。主题可以使用一次,也可以保存起来应用到多个图中。
主题元素 | 类型 | 描述 |
---|---|---|
line | 所有线属性 | |
rect | 所有矩形区域属性 | |
text | 所有文本属性 | |
title | 所有标题属性 | |
plot.title | text | 图表标题 |
plot.background | rect | 图表背景 |
plot.margin | 图表边距 | |
panel.background | rect | 绘图区背景 |
panel.border | rect | 绘图区边框 |
panel.margin | rect | 绘图区边距 |
panel.grid | line | 网格线系统 |
panel.grid.major | line | 主网格线 |
panel.grid.minor | line | 次网格线 |
panel.grid.major.x | line | x轴主网格线 |
panel.grid.major.y | line | x轴次网格线 |
panel.grid.minor.x | line | y轴主网格线 |
panel.grid.minor.y | line | y轴次网格线 |
axis.line | line | 坐标轴线 |
axis.line.x | line | x坐标轴线 |
axis.line.y | line | y坐标轴线 |
axis.title | text | 轴标题 |
axis.title.x | text | x轴标题 |
axis.title.y | text | y轴标题 |
axis.text | text | 轴标签 |
axis.text.x | text | x轴标签 |
axis.text.y | text | y轴标签 |
axis.ticks | line | 坐标轴刻度线 |
axis.ticks.x | line | x坐标轴刻度线 |
axis.ticks.y | line | y坐标轴刻度线 |
axis.ticks.length | line | 刻度线长度 |
axis.ticks.margin | line | 刻度线与刻度线标签间的间距 |
legend.background | 图例背景 | |
legend.margin | 图例边界 | |
legend.key | 图例符号 | |
legend.key.size | 图例符号大小 | |
legend.key.height | 图例符号高度 | |
legend.key.width | 图例符号宽度 | |
legend.text | 图例文本标签 | |
legend.text.align | 图例文本对齐方式,0=左对齐,1=右对齐 | |
legend.title | 图例标题 | |
legend.title.align | 图例标题对齐方式 | |
legend.position | 图例位置,left,right,bottom,top,二维向量 | |
legend.direction | 图例排列方向,horizontal,vertical | |
legend.justification | 图例居中方式,center,或者向量 | |
legend.box | 多图例排列,horizontal,vertical |
data(Salaries, package="car")
library(ggplot2)
mytheme <- theme(plot.title=element_text(face="bold.italic",
size="14", color="brown"),
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(title="Salary by Rank and Sex", x="Rank", y="Salary") +
mytheme
2.7.5 保存图形
ggsave()函数能更方便地保存图形。它的选项包括保存哪幅图形,保存在哪里和以什么形式保存
ggsave( filename,
plot = last_plot(),
device = NULL,
path = NULL,
scale = 1,
width = NA,
height = NA,
units = c("in", "cm", "mm"),
dpi = 300,
limitsize = TRUE,
...
)
Reference
1.R语言实战第二版
2.https://blog.csdn.net/kmd8d5r/article/details/79386843