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系统)