R013 绘图简介

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()
R013 绘图简介_第1张图片
image.png
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)
R013 绘图简介_第2张图片
image.png
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)
image.png
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)
R013 绘图简介_第3张图片
image.png
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()
R013 绘图简介_第4张图片
image.png
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="")
R013 绘图简介_第5张图片
image.png
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))
image.png
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")
image.png
  • 颜色
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)
R013 绘图简介_第6张图片
image.png

可以通过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)
R013 绘图简介_第7张图片
image.png
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
R013 绘图简介_第8张图片
image.png
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

你可能感兴趣的:(R013 绘图简介)