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

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()函数(可选),添加注释

在这里插入图片描述

  • 分组与小面化
    • 分组:在一个图形中显示两组或多组观测结果
    • 小面化:在单独,并列的图形上显示观察组
    • 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")

在这里插入图片描述

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

  • 步骤:最基础的绘图步骤
    • :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箱线图的宽度

在这里插入图片描述在这里插入图片描述

  • 示例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")# 地毯图表示薪水的一般扩散

在这里插入图片描述

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

在这里插入图片描述

四、分组(重叠图形)

  • 情形:在一个图中画出两个或多组图的观察值
  • 数据类型因子
  • 函数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)

在这里插入图片描述

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

在这里插入图片描述

  • 示例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)

在这里插入图片描述

五、刻面(并排图形)

  • 概念:分组时为了让图形重叠,刻面是为了让图形并排出现。
  • 数据类型因子
  • 函数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)

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

六、添加光滑曲线

  • 概念:添加光滑曲线(线性,非线性,非参数)和置信空间到散点图
  • 图形对象散点图
  • 函数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年一直上涨。
# 对数据集中的大部分范围,男性能拿到更高的薪水

在这里插入图片描述

七、修改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")

在这里插入图片描述

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%

在这里插入图片描述

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)

在这里插入图片描述

  • 示例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)

在这里插入图片描述在这里插入图片描述

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

在这里插入图片描述

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)

在这里插入图片描述

补——颜色集

  • 功能:生成调色板,既一串颜色的集合。
  • 函数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()

在这里插入图片描述

八、保存图形

  • 函数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系统)


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部