R语言

R语言学习笔记——扩展篇:第十九章-使用ggplot2进行高级绘图



文章目录

  • R语言
  • 一、R中的四种图形系统
  • 二、ggplot2包介绍
  • 三、用几何函数指定图的类型
  • 四、分组(重叠图形)
  • 五、刻面(并排图形)
  • 六、添加光滑曲线
  • 七、修改ggplot2图形的外观
  • 7.1、坐标轴
  • 7.2、图例
  • 7.3、标尺
  • 7.4、主题
  • 7.5、多重图
  • 补——颜色集
  • 八、保存图形



一、R中的四种图形系统

  • 基础图形系统:R自带
  • grid图形系统
  • grid包
  • 特点
  • 用户在图像设备上随意创建矩形区域并定义坐标系统,然后使用绘图基础单元来控制图形元素的摆放与外观。
  • 对图形的灵活性很高,适用于软件开发者,但不提供生成统计图形以及完整绘图的函数,不适合数据分析师
  • lattice图形系统
  • lattice包
  • 特点
  • 绘制网格图形,其显示一个变量的分布或者变量之间的关系,分别显示一个或多个变量的各个水平。
  • 基于grid包创建,处理多元数据的可视化功能很强。(一般为绘图的备选方案)
  • ggplot2图形系统
  • ggplot2包
  • 特点
  • 最常用的图形系统
  • 一种全面的,基于语法的,连贯一致的图形生成系统。

二、ggplot2包介绍

  • 语法:每一个函数修改属于自己的部分,函数与函数之间用(+)号函数串联
  • 示例
library(ggplot2)
ggplot(data = mtcars,aes(x=wt,y=mpg)) + 
  # 指定数据集(mtcars)与变量(wt,mpg),aes()函数(aesthetic,美观)指定每个变量的角色
  # mtcars数据集,包含32辆汽车的详细信息
  geom_point(pch=17,color="blue",size=2)+
  # ggplot()函数没有自己的图形输出。使用几何函数(geom)添加几何对象
  # geom_point()函数绘制散点图,使用2倍大小的蓝色三角符号(pch=17)
  geom_smooth(method ="lm",color="red",linetype=2)+
  # geom_smooth()函数绘制平滑曲线,绘制一条线性拟合(method ="lm")的红色虚线(linetype=2)
  labs(title = "Automobile Data",x = "Weight",y = "Miles per Gallon")
  # labs()函数(可选),添加注释

R语言 ggplot2入门 r语言ggplot绘图教程_学习

  • 分组与小面化
  • 分组:在一个图形中显示两组或多组观测结果
  • 小面化:在单独,并列的图形上显示观察组
  • ggplot2包在定义组或面时使用因子
  • 示例
library(ggplot2)
mtcars$am <- factor(mtcars$am,levels = c(0,1),labels = c("Automatic","Manual"))
# 变速箱类型(自动与手动)
mtcars$vs <- factor(mtcars$vs,levels = c(0,1),labels = c("V-Engine","StraightEngine"))
# 发动机装置(V型与直列式发动机)
mtcars$cyl <- factor(mtcars$cyl)
# am与vs是刻面变量,cyl是分组变量
ggplot(data = mtcars,aes(x = hp,y = mpg,shape = cyl,color = cyl)) +
  geom_point(size = 3) +
  facet_grid(am~vs) +
  labs(title = "Automobile Data by Engine Type",x = "Horsepower",y = "Miles per Gallon")

R语言 ggplot2入门 r语言ggplot绘图教程_r语言_02

三、用几何函数指定图的类型

  • 步骤:最基础的绘图步骤
  • :ggplot()函数指定要绘制的数据源和变量,ggplot(data = ,aes(x=,y=))
  • :调用几何函数geom函数在视觉上表现变量,目前有37个gemo函数
  • 常用几何函数

函数

功能

参数

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、size、alpha、shape

geom_rug()

地毯图

color、side

geom_smooth()

拟合曲线图

color、fill、method、linetype、formula、size

geom_text()

文字注解

详见help

geom_violin()

小提琴图

color、fill、alpha、linetype

geom_vline()

垂线

color、size、alpha、linetype

  • 参数详解

参数

功能

color

对点,线,填充区域的边界着色

fill

对填充区域着色,如条线和密度区域

alpha

颜透明度,0(透明)-1(不透明)

linetype

图案的线条,同lty(1=实线,2=虚线,3=点,4点破折号,5=长破折号,6=双破折号)

size

点的尺寸,线的宽度

shape

点的形状,同pch

position

绘制诸如条形图和点等对象的位置。对条形图"dodge"将分组条形图并排,"stacked"堆叠分组条形图,"fill"垂直的堆叠分组条形图并且高度相同。对点,"jitter"将点散开分布,减少重叠

binwidth

直方图宽度

notch

方块图是否应有缺口(T/F),若两个箱的缺口互不重叠,则表明它们的中位数有显著的差异

sides

地毯图的安置(“b”=底部,“l”=左部,“t”=顶部,“r”=右部,“bl”=左下部,等等)

width

箱线图的宽度

R语言 ggplot2入门 r语言ggplot绘图教程_开发语言_03

R语言 ggplot2入门 r语言ggplot绘图教程_R语言 ggplot2入门_04

  • 示例1
# car包的Salaries数据集,包含了大学教授的收入信息。
install.packages("car")
library(car)
ggplot(Salaries,aes(x=rank,y=salary)) +
  geom_boxplot(fill="#00DDAA",color = "black", notch = T) +
  geom_point(position = "jitter",color = "blue",alpha =.5) +
  geom_rug(sides = "l",color = "black")
  # 地毯图表示薪水的一般扩散

R语言 ggplot2入门 r语言ggplot绘图教程_开发语言_05

  • 示例2
library(lattice)
ggplot(singer,aes(x = voice.part,y = height)) +
  geom_violin(fill = "lightblue") +
  geom_boxplot(fill = "lightgreen",width = .2)

R语言 ggplot2入门 r语言ggplot绘图教程_坐标轴_06

四、分组(重叠图形)

  • 情形:在一个图中画出两个或多组图的观察值
  • 数据类型因子
  • 函数aes()
  • 变量赋给color,fill,shape,linetype等元素,进行分组
  • 示例1:以学术等级分组的大学薪酬,红——助理教授,绿——副教授,蓝——教授
# car包的Salaries数据集中的变量,rank(助理教授,副教授,教授),sex(男性,女性)
# yrs.service(工龄),salary(九个月薪水(美元)),yrs.since.phd(获得博士学位年份)
library(car)
# 以学术等级分组的大学薪酬,红——助理教授,绿——副教授,蓝——教授
ggplot(Salaries,aes(x=salary,fill=rank)) +
  geom_density(alpha =.5)

R语言 ggplot2入门 r语言ggplot绘图教程_坐标轴_07

  • 示例2:博士毕业年数和薪水的散点图,红——助理教授,绿——副教授,蓝——教授
# 博士毕业年数和薪水的散点图,红——助理教授,绿——副教授,蓝——教授
ggplot(Salaries,aes(x=yrs.since.phd,y=salary,color=rank,shape=sex)) +
  geom_point()

R语言 ggplot2入门 r语言ggplot绘图教程_坐标轴_08

  • 示例3:按学术等级和性别划分的教授数量
# 按学术等级和性别划分的教授数量
a <- ggplot(Salaries,aes(x=rank,fill=sex)) +
  geom_bar(position="stack") +
  labs(title='position="stack"')

b <- ggplot(Salaries,aes(x=rank,fill=sex)) +
  geom_bar(position="dodge") +
  labs(title='position="dodge"')

c <- ggplot(Salaries,aes(x=rank,fill=sex)) +
  geom_bar(position="fill") +
  labs(title='position="fill"',y="%")

library(gridExtra)
grid.arrange(a,b,c,ncol=3)

R语言 ggplot2入门 r语言ggplot绘图教程_R语言 ggplot2入门_09

五、刻面(并排图形)

  • 概念:分组时为了让图形重叠,刻面是为了让图形并排出现。
  • 数据类型因子
  • 函数facet_wrap()函数和facet_grid()函数
  • 语法与参数

语法

功能

facet_wrap(~var,ncol=n)

将每个var水平排列成n列的独立图

facet_wrap(~var,nrow=n)

将每个var水平排列成n行的独立图

facet_grid(rowvar~colvar)

rowvar和colvar组合的独立图,对应为行~列

facet_grid(rowvar~.)

每个rowvar水平的独立图,配置成一个单列

facet_grid(.~colvar)

每个colvar水平的独立图,配置成一个单行

  • 示例1:各个声部歌手的身高分布
ggplot(singer,aes(height)) +
  geom_histogram(bins = 30) +
  facet_wrap(~voice.part,nrow = 4)

R语言 ggplot2入门 r语言ggplot绘图教程_开发语言_10

  • 示例2:同时包含了分组和刻面
library(car)
ggplot(Salaries,aes(x=yrs.since.phd,y=salary,color=rank,shape=rank)) +
  geom_point() +
  facet_grid(.~sex)

R语言 ggplot2入门 r语言ggplot绘图教程_开发语言_11

  • 示例3:展示每个声部成员的身高分布,并利用核密度图水平排列,给每个声部分配不同的颜色。
ggplot(singer,aes(x=height,fill=voice.part)) +
  geom_density() +
  facet_grid(voice.part~.)

R语言 ggplot2入门 r语言ggplot绘图教程_开发语言_12

六、添加光滑曲线

  • 概念:添加光滑曲线(线性,非线性,非参数)和置信空间到散点图
  • 图形对象散点图
  • 函数geom_smooth()函数(其依赖于stat_smooth()函数
  • 语法与参数

语法

功能

method

绘制方法。lm=线性,glm=广义线性,smooth=loess(非参数,默认),rlm=健壮线性,gam=广义相加

formula

公式。如yx(默认),y=poly(x,n)表示n次多项式拟合,yns(x,n)表示一个具有n给自由度的样条拟合

se

绘制置信区间(T/F),默认为T

level

置信空间水平(默认95%)

fullrange

指定拟合应涵盖全图(T)或仅仅是数据(F,默认)

  • 示例
# 探究博士毕业年数与薪水的关系
ggplot(Salaries,aes(x=yrs.since.phd,y=salary,linetype=sex,shape=sex,color=sex))  +
    geom_smooth(method = lm,formula = y~poly(x,2),se=F,size=1) +
    geom_point(size=2)
# 对男性而言,曲线从0-30年增加后下降。对女性,拟合曲线从0-40年一直上涨。
# 对数据集中的大部分范围,男性能拿到更高的薪水

R语言 ggplot2入门 r语言ggplot绘图教程_R语言 ggplot2入门_13

七、修改ggplot2图形的外观

  • 在绘制基础图形时,可以利用par( )等函数来修改图形(第三章)
  • 这些方法对ggplot2图形没有影响,ggplot2提供了特定的函数来改变其预先外观

7.1、坐标轴

  • 概念:自定义坐标轴,包括刻度线,刻度标记标签和坐标轴标签
  • 函数
  • ggplot2的函数区分x/y轴,以及轴线是否代表一个连续或者离散变量(因子)

函数

功能与参数

labs()

添加标题,改变坐标轴

scale_x_continuous()和scale_y_continuous()

breaks指定刻度标记,labels指定刻度标记标签,limits控制要展示的值的范围(改坐标轴的标签)

scale_x_discrete()和scale_y_discrete()

breaks对因子的水平进行放置与排序,labels指定这些水平的标签,limits表示哪些水平应该展示(对坐标轴标签重排序,效果等同于事先对数据进行因子顺序化排序)

coord_flip()

颠倒x/y轴

  • 示例
# 收入与学术排名成正比,同等级中男性比女性薪酬水平高
library(ggplot2)
ggplot(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")) +
  # \n 换行符
  scale_y_continuous(breaks = c(50000,100000,150000,200000),
                     labels = c("$50K","$100K","$150K","$200K")) +
  labs(title = "Faculty Salary by Rank and Sex")

R语言 ggplot2入门 r语言ggplot绘图教程_学习_14

7.2、图例

  • 概念:指出如何利用颜色,形状,尺寸等视觉特效来表示数据特征的指南
  • 图例标题
  • 步骤一:判断图例时基于颜色,形状,尺寸等具体内容(具体见**aes()**函数中的内容)进行区分的
  • 步骤二:将fill=“mytitle”(假设以fill进行区分)添加到**labs()**函数中
  • 图例位置
  • 函数theme()函数中的legend.position参数选项
  • 参数值:left,top,right(默认),bottom,none(删除)或向量参数指定位置c(x,y)其中x,y(0-1),表示距离左侧边缘x底部边缘y
  • 示例
library(ggplot2)
ggplot(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")) +
  # \n 换行符
  scale_y_continuous(breaks = c(50000,100000,150000,200000),
                     labels = c("$50K","$100K","$150K","$200K")) +
  labs(title = "Faculty Salary by Rank and Sex",fill="Gender") +
  theme(legend.position = c(.1,.8))
  # 表示距离左侧边缘10%底部边缘80%

R语言 ggplot2入门 r语言ggplot绘图教程_R语言 ggplot2入门_15

7.3、标尺

  • 概念:包数据空间的观察值(连续或离散变量)映射到可视化空间中
  • 示例1:连续型标尺映射数值型变量到图中
ggplot(mtcars,aes(wt,mpg,size=disp))+
  geom_point(aes(fill = disp), shape = 21, color = "black", stroke = 0.5) +
  scale_fill_continuous(low = "white",high = "red") + 
  # 设置上下限颜色
  theme_bw() + theme(panel.grid.major = element_blank(),
                     panel.grid.minor = element_blank(),
                     text = element_text(family = "sans",size = 12,face = "bold"),
                     axis.text.y = element_text(size = 8),
                     axis.text.x.bottom = element_text(size = 8, angle = 45, hjust = 1, vjust = 1)) +
  labs(x=NULL,y=NULL)

R语言 ggplot2入门 r语言ggplot绘图教程_学习_16

  • 示例2:离散型标尺将带有因子水平的视觉线索(如颜色,形状,尺寸,线条类型和透明度)关联起来
  • 函数scale_color_manual(values)
  • 指定颜色
  • 函数scale_color_brewer(palette =" name")
  • 使用预先设定好的颜色集
  • 函数display.brewer.all()
  • 展示所有的内置颜色集,既name
ggplot(Salaries,aes(x=yrs.since.phd,y=salary,color=rank)) +
         scale_color_manual(values=c("orange","olivedrab","navy")) +
         geom_point(size=2)
         
ggplot(Salaries,aes(x=yrs.since.phd,y=salary,color=rank)) +
  scale_color_brewer(palette ="Set1") +
  geom_point(size=2)

R语言 ggplot2入门 r语言ggplot绘图教程_R语言 ggplot2入门_17

R语言 ggplot2入门 r语言ggplot绘图教程_坐标轴_18

7.4、主题

  • 概念:控制图片的整体外观,如调节字体,背景,颜色和网格线等。
  • 主题可以保存起来运用到多个图形中
  • 函数theme()
  • 示例
mytheme <- theme(
  plot.title = element_text(face = "bold.italic",size = 14,color = "brown"),
  # 标题为斜粗体棕色14号
  axis.title = element_text(face = "bold.italic",size = 10,color = "brown"),
  # 轴标题为斜粗体棕色10号
  axis.text = element_text(face = "bold",size = 9,color = "darkblue"),
  # 坐标轴标签为粗体深蓝色9号
  panel.background = element_rect(fill = "white",color = "darkblue"),
  # 白色背景填充加深蓝色边框
  panel.grid.major.y = element_line(color = "grey",linetype = 1),
  # 主水平网格y轴(水平线)为灰色实线
  panel.grid.minor.y = element_line(color = "grey",linetype = 2),
  # 次水平网格y轴(水平线)为灰色虚线
  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

R语言 ggplot2入门 r语言ggplot绘图教程_学习_19

7.5、多重图

  • 概念:将多个单独的图片放在单个图形中
  • 函数gridExtra包中的grid.arrange()函数
  • 语法
grid.arrange(figure1,figure2...,nrow=n,ncol=m, newpage = TRUE)
# n行m列,按行排列图片
  • 示例
a <- ggplot(Salaries,aes(x=rank,fill=sex)) +
    geom_bar(position="stack") +
    labs(title='position="stack"')
  
  b <- ggplot(Salaries,aes(x=rank,fill=sex)) +
    geom_bar(position="dodge") +
    labs(title='position="dodge"')
  
  c <- ggplot(Salaries,aes(x=rank,fill=sex)) +
    geom_bar(position="fill") +
    labs(title='position="fill"',y="%")
  
  d <- ggplot(Salaries,aes(x=yrs.since.phd,y=salary,linetype=sex,shape=sex,color=sex))  +
    geom_smooth(method = lm,formula = y~poly(x,2),se=F,size=1) +
    geom_point(size=2)
  
  install.packages("gridExtra")
  library(gridExtra)
  grid.arrange(a,b,c,d,nrow=2,ncol=2)

R语言 ggplot2入门 r语言ggplot绘图教程_学习_20

补——颜色集

  • 功能:生成调色板,既一串颜色的集合。
  • 函数brewer.pal(),display.brewer.all()
  • 语法
brewer.pal(3-x,name)
# 3-x表示颜色数量,3是最小值。x根据颜色集name中数量而定,name为内置颜色集
display.brewer.all()
# 展示所有的内置颜色集,既name
  • 功能:扩展颜色集。当颜色集里面的颜色不够时,将其进一步划分。
  • 函数:== colorRampPalette()==
  • 语法
colorRampPalette(colors = c())(n) 
# 将colors转化为n种颜色
  • 功能:反转数据。
  • 函数rev()
  • 语法
rev()
# 函数用于返回数据对象的反向版本,为了美观可以将颜色反转
  • 示例
colors <- colorRampPalette( rev(brewer.pal(9, "Blues")) )(255)
library(RColorBrewer)       
display.brewer.all()

R语言 ggplot2入门 r语言ggplot绘图教程_学习_21

八、保存图形

  • 函数ggsave()
  • 语法
ggsave(
  filename,
  plot = last_plot(),
  device = NULL,
  path = NULL,
  scale = 1,
  width = NA,
  height = NA,
  units = c("in", "cm", "mm", "px"),
  dpi = 300,
  limitsize = TRUE,
  bg = NULL,
  ...
)
  • 示例
# lattice包中的singers数据集,包含了纽约合唱歌手的高度和语音变量
library(lattice)
myplot <- ggplot(singer,aes(x = voice.part,y = height)) +
  geom_violin(fill = "lightblue") +
  geom_boxplot(fill = "lightgreen",width = .2)

ggsave(filename = "singers2.png",plot = myplot,width = 5,height = 4,dpi = 5000,path = "C:/Users/16748/Desktop")
# 如果不加plot选项,会保存最近的那张图片
# 不加path选项,会保存在当前路径
# 文件扩展名可以为png,ps,txt,jpeg,pd,tff,bmp,svg或wmf(限Windows系统)