数据可视化 | 使用R语言绘制专业图表(Ⅰ)——ggplot2 图形语法基础
内容概要:空闲时间,基于张杰的《R语言数据可视化之美》、《R语言实战》、《R cookbook》三本书,将其中关于ggplot2绘图的部分进行自学总结。在学习的过程中,发现张杰的《R语言数据可视化之美》对于图表绘制的介绍很系统,但是阅读可进入性不是很高。于是我将学习过程中的一些要点进行总结归纳。如果想系统仔细的学习,还是要花些时间看张杰的《R语言数据可视化之美》。学之记之。
概述:ggplot2语法框架
ggplot2 是一个功能强大且灵活的 R 包,作图的原理类似于PS中的图层作图,除了基础层是必须要拥有的要素以外,其余的元素分别要以图层的形式添加进去,这样对图表绘制的可调节性就比较大,更能够满足绘图者的需求。通常使用geom_xxx() 就可以往已有图层中添加一个数据元素。
ggplot2 语法框架(改绘于张杰《R语言可视化之美》)
ggplot2 绘图的基本语法结构如下所示,其中必须输入的信息如下:
-[1]ggplot():底层绘图函数。DATA为数据集,MAPPINGS变量为视觉通道映射,用来标识变量 x 和 y,还可以在其中控制颜色(color)、大小(size)、形状(shape)等。
-[2]geom_xxx()|stat_xxx():添加几何图层或统计变换,比如常见的geom_point()、geom_bar()等,通常使用geom_xxx()就可以绘制大部分我们所需要的图形;但是有时是还需要使用stat参数先进行统计变换。
可选的输入部分主要包括5个部分,主要实现图表的美化或变化:
-[1]scale_xxx():度量调整,调整具体的度量,包括颜色(color)、大小(shape)、形状(shape),跟MAPPINGS 的映射变量相对应。
-[2]coord_xxx():坐标变换,默认为笛卡尔坐标系,还可以是极坐标系、地理空间坐标系等。
-[3] facet_xxx():分面系统,将某个变量进行分面变换,包括按行和列和格网形式等绘制分面图。
-[4]guides():图例调整,主要包括连续型和离散型两种类型的图例。
-[5]theme():主题设定,主要用于调整图表的细节,包括图表的颜色、网格线的间隔和颜色等。
ggplot (data = <DATA>, mapping = aes (<MAPPINGS>
)) + ** 【基础图层,不出现图层元素】 geom_xxx() | stat_xxx()+ 【几何图层或统计变换,出现图形元素】
scale_xxx() + 【度量调整,调整具体的标度】*
coord_xxx() + 【坐标变换,默认为笛卡尔坐标系】
facet_xxx() + 【分面系统,将某个变量进行分面变换】
guides() + 【图例调整】
theme() + 【主题设定】
ggplot2 绘图基本语法结构
1、geom_xxx() ——几何对象函数
R 中包含几十种的 geom_xxx() 函数,主要用来绘制图形元素。根据输入的变量总数和数据类型(连续还是离散)可以将函数分为3个大类、6个小类及2个特殊函数。
geom_xxx()_几何对象函数的分类
其中,①图元系列函数主要用于绘制基本的图表元素,比如矩形方块、多边形、线段等,可以供用户创造新的图表类型。②误差展示函数需要先设置统计变换参数,才能自动根据数据计算得到均值与标准差,再使用其绘制误差信息。③其余数据需要先根据变量的数目和类型进行判断,再看提供的函数,绘制想要的图形。
2、stat_xxx()——统计变换函数
我们可以将 geom_xxx() 和 stat_xxx() 都视作图层,大多数都是由成对的出现的两者完成的,绘图效果也很相似,但并非相同。每一个图层都包含一个几何对象和统计变换,即每一个geom_xxx()开头的对象都含有一个stat参数,每一个stat_xxx()开头的函数也包含一个geom参数,两者的不同如下。
stat_xxx()开头的函数:无需设定变换参数,但需指定geom,就可以绘制与之相对应的统计类型图表。在使用中只需要变换geom()参数,就可以通过统计结果变换不同的图表,更加侧重于统计变换过程。
geom_xxx()开头的函数:更加侧重图表类型的绘制,而通过修改统计变换参数,就可以实现绘图前数据的统计变换,比如绘制均值散点,a1使用stat()函数,a2使用geom()函数,两者实现效果一致。
#a1
ggplot(mydata, aes(Class,Value,fill=Class))+
stat_summary(fun.y='mean',fun.args=list(mult=1),geom='point',color='white',size=4)
#a2
ggplot(mydata,aes(Class,Value,fill=Class))+
geom_point(stat='summary',fun.y='mean',fun.args=list(mult=1),color='white',size=4)
下面将常见的统计变换函数进行汇总:
函数名称 | 函数的功能和描述 | 函数名称 | 函数的功能和描述 |
---|---|---|---|
bin | 计算封箱(bin)数据 | bin2d | 计算矩形封箱内的观测值个数 |
bindot | 计算“点直方图”的封箱数据 | binhex | 计算六边形热图的封箱数据 |
boxplot | 计算组成箱线图的各种元素值 | contour | 三维数据的等高线 |
density | 一维密度估计 | density2d | 二维密度估计 |
function | 添加新函数 | identity | 不对数据进行统计变换 |
计算qq图的相关值 | quantile | 计算连续的分位数 | |
smooth | 添加光滑曲线 | spoke | 将角度和半径转换成xend和yend |
sum | 计算每个单一值得频数 | summary | 对每个x所对应的y值做统计描述 |
summary2d | 对2维矩形封箱设定函数 | summaryhex | 对2维六边形封箱设定函数 |
unique | 删除重复值 | y density | 小提琴图计算1维y轴方向和密度 |
当绘制的图形不涉及统计变换的时候,绘图可以直接使用 geom_xxx() 函数,无需设定stat参数,因为会默认stat=‘identity’。只有设计统计变换的处理时,才需要使用stat参数,或者使用 stat_xxx() 来强调统计变换。
3、MAPPINGS——视觉通道映射
R语言可用作变量的视觉通道映射的参数主要包括color、fill、size、angle、linetype、shape、vjust和hjust,其具体说明如下所示。但是在具体的使用过程中,需要注意类别型变量和数值型变量的使用条件。
color/col/colour、fill 和 alpha 的属性都是与颜色相关的视觉通道映射参数。其中,color / col / colour 是指点(point)、线(line)和 填充区域(region)轮廓的颜色;fill 是指指定填充区域(region)的颜色;alpha 是指颜色的透明度,数值范围从 0 (完全透明) 到 1(不透明).
size 是指点(point)的尺寸或线(line)的宽度,默认单位为 pt,可以在 geom_point() 函数绘制的散点图的基础上,添加 size 的映射,从而实现气泡图的绘制。
angle 是指角度,只有部分几何对象有,如 geom_text() 函数中文本的摆放角度、geom_spoke() 函数中短棒的摆放角度。
vjust 和 hjust 都是与位置调整有关的视觉通道映射参数。其中 vjust 是指垂直位置的微调,在(0,1)区间的数字或位置字符串:0=‘buttom’,0.5=‘middle’,1=‘top’;hjust是指在水平位置的微调,其中:0=‘left’,0.5=‘center’,1=‘right’,区间外的数字微调比例控制不均。
linetype 是指线条的类型,包括白线(0=‘black’)、实线(1=‘solid’)、短虚线(2=‘dashed’)、点线(3=‘dotted’)、点横线(4=‘dot dash’)、长虚线(5=‘long dash’)、短长虚线(6=‘two dash’)。
shape 是指点的形状,为[0,25]区间内的26个整数,分别对应不同的形状。
[图1 age 映射到大小 // 图2 age 映射到大小和颜色 // 图3 class 映射到填充颜色 // 图4 age、class分别映射]
视觉通道示例图(使用了《R语言数据可视化之美配套数据》)
library(ggplot2)
df <- read.csv('E:\\program files\\R\\Facet_Data.csv', header=TRUE)
# 第一张图
p1 <- ggplot(data=df, aes(x=SOD, y=tau, size=age)) +
geom_point(shape=21, color='black', fill='#336A97', stroke=0.25) # stroke 轮廓线条粗细
# 第二张图
p2 <- ggplot(data=df, aes(x=SOD, y=tau, size=age,fill=age)) +
geom_point(shape=21, color='black', stroke=0.25, alpha=0.8)
# 第三张图
p3 <- ggplot(data=df, aes(x=SOD,y=tau, fill=Class)) +
geom_point(shape=21, size=3, color='black', stroke=0.25)
# 第四张图
p4 <- ggplot(data=df, aes(x=SOD, y=tau, fill=Class, size=age)) +
geom_point(shape=21, color='black', stroke=0.25, alpha=0.8)
library(gridExtra)
grid.arrange(p1,p2,p3,p4, ncol=2,nrow=2)
另外,字体(family)和字型(fontface)也是比较重要的映射。字型分为:plain(常规体)、bold(粗体)、italic(斜体)、bold.italic(粗斜体)。字体只有三种:sans、serif、mono。但是可以通过扩展包extra font 将其他字体转换为 ggplot2 可识别的字体,话可以通过 show text 包以图片的形式将字体插入到ggplot2中。
# 上图实现代码
library(ggplot)
df <- expand.grid(x=seq(0,1,length.out=4), y=seq(0,1,length.out=3))
df$fontface <- rep(c('plain','bold','italic','bold.italic'),3)
df$family <- rep(c('sans','times','mono'),each=4)
df$label <- paste(df$family,'\n','df$fontface')
ggplot(data=df, aes(x,y)) +
geom_text(aes(label=label, fontface=fontface, family=family),size=4)+
xlim(-0.2,1.3) +
ylim(-0.2,1.2)
4、scale_xxx()——度量调整
度量主要是用来控制变量映射到视觉对象的具体细节,在变量映射中虽然能够进行初步的颜色和形状分类,但是毕竟是粗尺度和默认的,要想实现视觉对象的自我精细定义,必须要使用度量调整。下表根据张杰的《R语言可视化之美》一书中的分类标准,将度量调整函数分为 数值型 和 类别型 两种。需要注意的是:ggplot2 中默认的度量为 scale_xxx_identity()。需要注意的是:scale_*_manual() 表示手动自定义离散的度量。
度量 | 数值型 | 类别型 |
---|---|---|
x:X轴度量 y:Y轴度量 |
scale_x/y_continuous() scale_x/y_log10() scale_x/y_sqrt() scale_x/y_revers() scale_x/y_date() scale_x/y_datetime() scale_x/y_time() |
scale_x/y_discrete() |
color:轮廓色度量 fill:填充颜色度量 |
scale_color/fill_continuous() scale_fill_distiller() scale_color/fill_gradient() scale_color/fill_gradient2() scale_color/fill_gradientn() |
scale_color/fill_discrete() scale_color/fill_brewer() scale_color/fill_manual() |
alpha:透明度度量 | scale_alpha_continuous() | scale_alpha_discrete() scale_alpha_manual() |
linetype:线形状度量 | NULL | scale_linetype_discrete() scale_linetype_manual() |
shape:形状度量 | NULL | scale_shape() scale_shape_manual |
size:大小度量 | scale_size() scale_size_area() |
scale_size_manual() |
ggplot2 常见的度量调整函数
下图借用张杰《R语言数据可视化之美》书中的示例数据,进行演示:[图1 中,散点大小 size 的度量调整]、[图2 中,散点大小 size 和填充颜色 fill 的度量调整]、[图3 中,填充颜色 fill 和形状 shape 的度量调整]、[图4 中,散点大小 size 和 填充颜色 fill 的度量调整]。
不同度量的调整效果
library(ggplot2)
library(RColorBrewer)
df <- read.csv('E:\\program files\\R\\Facet_Data.csv',header=TRUE)
# 第一张图
p1 <- ggplot(data=df, aes(x=SOD,y=tau,size=age))+
geom_point(shape=21, color='black', fill='#E53F2F', stroke=0.25, alpha=0.8)+
scale_size(range=c(1,8))
# 第二张图
p2 <- ggplot(data=df, aes(x=SOD,y=tau, fill=age, size=age))+
geom_point(shape=21, color='black', stroke=0.25, alpha=0.8)+
scale_size(range=c(1,8))+
scale_fill_distiller(palette='Reds')
# 第三张图
p3 <- ggplot(data=df, aes(x=SOD, y=tau, fill=Class, shape=Classs))+
geom_point(size=3, color='black', stroke=0.25)+
scale_fill_manual(values=c('#36BED9','#FF000','#FBAD01'))+
scale_shape_manual(values=c(21,22,23))
# 第四张图
p4 <- ggplot(df, aes(x=SOD, y=tau, fill=Class, size=age))+
geom_point(shape=21, color='black', stroke=0.25, alpha=0.8)+
scale_fill_manual(values=c('#36BED9','#FF000','#FBAD01'))+
scale_size(range=c(1,8))
library(gridExtra)
grid.arrange(p1,p2,p3,p4, ncol=2,nrow=2)
合理的使用通道映射参数,并调整合适的度量,是进行绘图的重要点。可视化最基本的形式就是简单的把数据映射为彩色图形,它的工作原理就像大脑倾向于寻找模式,可以在图形和它所代表的数字之间进行切换。一般情况下人们理解视觉暗示的精确程度是:
位置 > 长度 > 角度 > 方向 > 面积 > 体积 > 饱和度 > 色相 > 纹理 > 形状
在绘图过程中选择正确的视觉暗示取决于对形状、颜色、大小的理解,以及 数据本身要表达的目标。不同的图表应该要选择不同的视觉暗示,合理的视觉暗示组合能够更好的促进别人理解图表的数据信息。
library(ggplot2)
df <- read.csv('E:\\program files\\R\\Facet_Data.csv',header=TRUE)
#---------------------------------------------------------------------#
# 第一张图,位置+方向
p1 <- ggplot(data=df, aes(x=Time, y=value, group=variable))+
geom_line()+
geom_point(shape=21, size=4, color='black', fill='white')+
geom_classic()+
theme(
text = element_text(size=14, color='black'),
plot.title = element_text(size=14, family='mufont', face='bold.italic',hjust=0.5, color='black'),
legend.background = element_blank(),
legend.postion = c(0.2,0.8)
)
#---------------------------------------------------------------------#
# 第二张图,位置+方向+饱和度
p2 <- ggplot(data=df, aes(x=Time, y=value, fill=variable))+
geom_line()+
geom_point(shape=21, size=4, color='black')+
scale_fill_manual(values=c('grey60','grey30','black','white'))+
geom_classic()
#---------------------------------------------------------------------#
# 第三张图,位置+方向+形状
p3 <- ggplot(data=df, aes(x=Time, y=value, shape=variable))+
geom_line()+
geom_point(size=4, color='black', fill='grey60')+
scale_shape_manual(values=c(21,22,23,24))+
geom_classic()
#---------------------------------------------------------------------#
# 第四张图,位置+方向+颜色
p4 <- ggplot(data=df, aes(x=Time, y=value, fill=variable))+
geom_line()+
geom_point(size=4, color='black', color='black')+
scale_fill_manual(values=c("#FF9641","#FF5B4E","#B887C3","#38C25D"))+
geom_classic()
#---------------------------------------------------------------------#
# 第五张图,位置+方向+饱和度+形状
p5 <- ggplot(data=df, aes(x=Time, y=value, fill=variable,shape=variable))+
geom_line()+
geom_point(size=4, color='black', color='black')+
scale_fill_manual(values=c('grey60','grey30','black','white'))+
scale_shape_manual(values=c(21,22,23,24))+
geom_classic()
#---------------------------------------------------------------------#
# 第六张图,位置+方向+颜色+形状
p5 <- ggplot(data=df, aes(x=Time, y=value, fill=variable,shape=variable))+
geom_line()+
geom_point(size=4, color='black', color='black')+
scale_fill_manual(values=c("#FF9641","#FF5B4E","#B887C3","#38C25D"))+
scale_shape_manual(values=c(21,22,23,24))+
geom_classic()
#---------------------------------------------------------------------#
library(gridExtra)
grid.arrange(p1,p2,p3,p4,p5,p6, ncol=2, nrow=3)
在上面的例子中,要理解 fill、color、shape、size 等视觉通道映射参数的具体位置。①当出现在 aes() 中时,应该是要进行个性化映射,即每一个观测值都会按照我们指定的特定变量进行个性化设置,典型的情况就是按照因子进行分类。②当出现在aes()外时,应该是要对某些图形元素进行统一化设置,所有指定的观测值都会按照统一属性进行映射。
5、coord_xxx()——坐标系
在编码数据的时候,需要把数据放在一个结构化的空间中,即坐标系。其中,直角坐标系、极坐标系、地理坐标系三种基本可以满足我们的日常需求。但是在处理地理坐标系的时候,一般情况下对于城规而言,使用 Arc_gis 能够比在R中更好的实现地理信息的表达。
5.1 直角坐标系
ggplot2 中的直角坐标系包括 coord_cartesian()、coord_fixed()、coord_flip() 和 coord_trans() 四种类型。
coord_cartesian() 是默认的类型,其他坐标系都是根据直角坐标系画图,然后变换过来的。
coord_fixed() 用来固定纵横比,在绘制华夫饼图和复合型散点图时,需要固定:coord_fixed(ration=1)。
coord_flip() 用来翻转坐标系。会将 X 轴和 Y 轴 对换。
coord_tans() 坐标轴的刻度比例尺是变化的,应用较少,但是在部分数据集中比较常用。
普通直角坐标系(二维散点图+二维气泡图)
library(ggplot2)
# 绘制第一张图
p1 <- ggplot(data=mtcars, aes(x=mpg, y=hp)) +
geom_point(shape=21, size=4, color='black', fill='gold', stroke=0.25)+
coord_cartesian() # 使用默认的坐标系
# 绘制第二张图
p2 <- ggplot(data=mtcars, aes(x=mpg, y=hp, size=wt))+
geom_point(shape=21, size=4, color='black', fill='gold', stroke=0.25)+
coord_cartesian()
library(gridExtra)
grid.arrange(p1,p2, ncol=2, crow=1)
三维直角坐标系 可以分为 平行投影 和 透视投影 这两种情况。三维空间使用(x,y,z)三个值来表示三维空间中点的位置。三维指标坐标系一般使用 plot3D 包来绘制。如果扩展到平行坐标系,可以使用对高维几何和多元数据的可视化,一般使用 GGally 包中的 ggparcoord() 函数实现平行坐标系的绘制。
三维直角坐标系
5.2 极坐标系
雷达图、饼图就是极坐标图。ggplot2 中使用 coord_polar() 函数将坐标系从直角坐标系转换成极坐标系。具体的语句为:coord_polar(theta='x', start=0, direction=1, clip='on') ,其中 ① theta 表示极坐标化的中心轴,即 x 转换为圆周, y转换为半径;② direction 表示排列方向,1表示顺时针,-1表示逆时针;③ start 表示起始角度,以距离12点针的弧度度量。
5.3 地理坐标系
常用的地图投影方法有 墨卡托投影、兰伯特等角割圆锥投影、等距圆柱投影 等,不同区域常用的地图投影方法不同。ggplot2 中常使用 **coord_map() **和 coord_quickmap() 函数设定坐标系为地理空间坐标系。 ① 其中,coord_quickmap 函数保留经纬直线的快速绘制方法,适合绘制靠近赤道的较小区域;②coord_map() 函数可以通过设定 projection 参数,从而实现不同的地理空间坐标系投影,包括 墨卡托投影、兰伯特等角圆锥投影、Albers 等积正割圆锥投影、等距圆柱投影和正交投影等。
5.4 坐标系的转换
选择合适的坐标系有利于数据的清晰表达,极坐标系可以非常清楚的看到数据在周期和方向上的变化趋势,而对连续时间段的变化却不如直角坐标系。
从直角坐标系转为为极坐标系(《数据可视化之美》配套数据)
library(ggplot2)
#-----------------------------------------------------------
df <- read.csv('PolarBar.csv', header=TRUE)
p1 <- ggplot(df, aes(Data,Value))+
geom_bar(stat='identity',width=10, color='black', size=0.25, fill='blue')+
scale_x_continuous(name='Time(day)', breaks=seq(0,360,30))+
scale_u_contimuous(breaks=seq(0,160,20), limtis=c(0,160), expand=expand_scale(add=0))+
them_classic()
p2 <- ggplot(df, aes(Data, Value))+
geom_bar(stat='identity', width=10, color='black', size=0.25, fill='blue')+
scale_x_continuous(breaks=seq(0,360,30))+
scale_y_continuous(breaks=seq(0,115,30), limits=c(-30,115))+
coord_polar(theta='x', start=0)+
theme_light()+
theme(panel.background = element_blank(),
panel.grid.major = element_line(color='grey80', size=0.25),
axis.text.y = element_text(size=11, color='black'),
axis.line.y = element_line(size=0.25),
axis.text.x = element_text(size=11, color='black'))
#-----------------------------------------------------------
df<-read.csv("PolarArea_Data.csv", header = TRUE)
p3 <- ggplot(df,aes(Date,Value))+
geom_area(colour="black",size=0.25,fill="#FFA1B9")+
scale_x_continuous(name="Time(day)",breaks=seq(0,360,60),expand=expand_scale(add = 0))+
scale_y_continuous(breaks=seq(0,3500,500),limits=c(0,3500),expand = expand_scale(add = 0))+
theme_classic()
p4<-ggplot(df,aes(Date,Value))+
geom_area(colour=NA,size=0.25,fill="#FFA1B9")+
geom_line(colour="black",size=0.25)+
scale_x_continuous(name="Time(day)",breaks=seq(0,360,30))+
scale_y_continuous(breaks=seq(0,3000,500),limits=c(0,3000))+
coord_polar(theta = "x",start=0) +
theme_light()+
theme( panel.background = element_blank(),
panel.grid.major = element_line(colour = "grey80",size=.25),
axis.text.y = element_text(size = 10,colour="black"),
axis.line.y = element_line(size=0.25),
axis.text.x=element_text(size = 11,colour="black"))
#-----------------------------------------------------------
library(gridExtra)
grid.arrange(p1,p3,p2,p4,ncol=2,nrow=2)
5.5 坐标轴度量
坐标系指定了可视化的维度,而坐标轴的度量则指定了在每一个维度里数据映射的范围。大体来说坐标轴可以分为三类:数字坐标轴、分类坐标轴、时间坐标轴。
坐标轴度量的大体分类
其中,在这些函数里面大体都会有以下的参数,每个参数的名称及内涵整理如下:
参数 | 参数内涵 |
---|---|
name | 表示坐标轴的名称,也将作为对应的图例名 |
breaks | 表示指定坐标轴刻度位置,即粗网格线位置 |
label | 表示指定坐标轴刻度标签内容 |
limits | 表示指定坐标轴的显示范围,支持反区间 |
expand | 表示扩展坐标轴显示范围 |
trans | 表示指定坐标轴变换函数,exp()、log()、log10() |
示例:转换坐标轴度量
直角坐标系度量的调整
library(ggplot2)
df <- read.csv('MappingAnalysis_Data.csv', header=TRUE)
#-------------------------------------------------
p1 <- ggplot(data=df, aes(x=Time, y=value, fill=variable, shape=variable))+
geom_line()+
geom_point(size,color='black')+
scale_fill_manual(values=c("#FF9641","#FF5B4E","#B887C3","#38C25D"))+
scale_shape_manual(values=c(21,22,23,24))+
theme_classic()+
theme(
text = element_text(size=14, color='black'),
plot.title = element_text(size=14, family='myfont', face='bold.italic',hjust=0.5, color='black'),
legend.background = element_blank(),
legend.position = c(0.2,0.8)
)
#-------------------------------------------------
p2 <- ggplot(data=df, aes(x=Time, y=value, fill=variable, shape=variable))+
geom_line()+
geom_point(size=4, color='black'),
scale_fill_manual(values = c("#FF9641","#FF5B4E","#B887C3","#38C25D"))+
scale_shape_manual(values = c(21,22,23,24))+
scale_x_continuous(name='Time(d)', breaks=seq(0,20,2))+
scale_y_continuous(breaks=seq(0,90,10), limit=c(0,90), expand=c(0,1))+
theme_classic()+
theme(
text = element_text(size=14, color='black'),
plot.title = element_text(size=14,family='myfont', hujust=0.5, color='black'),
legend.background = element_blank(),
legend.position = c(0.2,0.8)
)
#-------------------------------------------------
library(gridExtra)
grid.arrange(p1,p2,nrow=1,ncol=2)
6、guides()——图例
图例作为图表背景信息的重要组成部分,对图表的正确和完整表达有重要作用。ggplot2 中 guide_colorbar / guide_colourbar 函数用于调整连续型变量的图例;guide_legend() 函数用于离散变量的图例,也可以用于连续型变量。
图例类型的设定:guides() 函数将 guide_colorbar 和 guide_legend 两种图例嵌套进去,方便映射与处理,如 guides( fill=guide_colorbar()),对多个图例共同处理的适合较为有效;除此方法之外,还可以在 scale_xxx() 中指定 guide 类型, guide='colorbar' 或者 guide='legend'。
图例位置的设定: 一般在 theme 函数中,用 legend.position 设定图例的位置,内部参数可以设置为 “none” ,“left”,“right”,“bottom”,“top”;也可以设置成一个二维向量组 c(0.2,0.8) ,一般数值在0-1之间。
图例位置的调整
Library(ggplot2)
df <- read.csv("MappingAnalysis_Data.csv", header = TRUE)
#----------------------------------------------------------
p1 <- ggplot(data=df, aes(x=Time, y=value, fill=variable, shape=variable))+
geom_line()+
geom_point(size=4, color='black')+
scale_fill_manual(values=c("#FF9641","#FF5B4E","#B887C3","#38C25D"))+
scale_shape_manual(vaulues=c(21,22,23,24))+
scale_x_continuous(name='Time(d)', breaks=seq(0,20,2))+
scale_y_continuous(breaks=seq(0,90,10),limits=c(0,90), expand=c(0,1))+
theme_classic()+
theme(
text = element_text(size=14, color='black'),
legend.background = element_rect(fill='white'),
legend.position = 'right'
)
#----------------------------------------------------------
p1 <- ggplot(data=df, aes(x=Time, y=value, fill=variable, shape=variable))+
geom_line()+
geom_point(size=4, color='black')+
scale_fill_manual(values=c("#FF9641","#FF5B4E","#B887C3","#38C25D"))+
scale_shape_manual(vaulues=c(21,22,23,24))+
scale_x_continuous(name='Time(d)', breaks=seq(0,20,2))+
scale_y_continuous(breaks=seq(0,90,10),limits=c(0,90), expand=c(0,1))+
theme_classic()+
theme(
text = element_text(size=14, color='black'),
legend.background = element_blank(),
legend.position = c(0.2,0.8)
)
#----------------------------------------------------------
library(gridExtra)
grid.arrange(p1,p2,nrow=1,ncol=2)
7、theme()——主题系统
ggplot2 图表的主题系统的主要对象包括 文本(text)、矩形(rect)和线条(line)三大类,对应的函数包括element_text()、element_rect()、element_line() 三个,另外还有 element_blank() 表示该对象设置为无。其中,我们使用比较多的系统对象是 坐标轴的标签(axis.text.x、axis.text.y)、图例的位置与背景(legend.position 和 legend.background)。X 轴标签在绘制极坐标柱形图和径向柱形图时会用于调整X轴标签的旋转角度;Y轴标签会用于时间序列峰峦图的 Y 轴标签替换等。
对象 | text | rect | line |
---|---|---|---|
函数 | element_text() 参数:family、face、color、size、hjust、vjust、angle、lineheight |
element_rect() 参数:color、size、type |
element_line() 参数:fill、color、size、type |
图形对象整体 | plot.title plot.subtitle plot.caption |
plot.background plot.sapcing plot.margin |
NULL |
绘图区 | NULL | panel.background panel.border panel.spacing |
panel.grid.major pannel.grid.minor panel.grid.major.x panel.grid.major.y panel.grid.minor.x panel.grid.minor.y |
坐标轴 | axis.title axis.title.x axis.title.y axis.text axis.text.x axis.text.y |
NULL | axis.line axis.line.x axis.line.y axis.ticks axis.ticks.x axis.ticks.y axis.ticks.length axis.ticks.margin |
图例 | legend.text legend.text.title legend.text.align |
legend.background legend.margin legend.spacing legend.spacing.x legend.spacing.y |
NULL |
分面系统 | strip.text strip.text.x strip.text.y |
strip.background | NULL |
主题系统的主要对象
因为里面的主题系统要设置的东西很多,不方便新手入门,可以使用 ggThemeAssit 包,安装该包前需要安装 shiny 包,然后把自己要画出图形的代码选中,在 Tools → Addins → ggplot Theme Assistant 选项,就会出现一个交互式的窗口,然后进行调整便可。
使用 ggplot Theme Assistant 操作界面
library(ggplot2)
library(wesanderson) # 颜色包
library(shiny) # 必须要加载和安装
libray(ggThemeAssist)
ggplot(iris, aes(Sepal.Length, Petal.Length, fill=Species))+
geom_point(size=3.5, shape=21, color='black')+
geom_fill_manual(values=wes_palette(n=3, name='Darjeeling1'))+
theme_minimal() # x选中这段代码再调用就会将设置好的主题代码放在后面
R语言的主题模板包包括 **ggthemes, ggtech, ggthemer, ggsci, cowplot **等,其中 ggsci 就是专门为学术图表开发的包。ggplot2 中自带的主题模板也有很多中,包括theme_gray()、theme_minimal()、theme_bw()、theme_light()、theme_test()、theme_classic()等函数,在具体使用的过程中还应根据需求继续微调。
8、位置调整
在 geom_xxx() 函数中,参数 position 表示绘图数据系列的位置调整,默认为 ‘identity’ ,这个参数在绘制柱形图和条形图时经常用到,用来绘制簇状柱形图、堆积柱形图和百分比堆积柱形图等。在柱形图和条形图系列中,position 的参数有四种:
identity:不做任何位置调整,该情况在多分类柱形图中不可行,序列间会遮盖,但是在多序列散点图、折线图中可行,不存在遮盖问题。
stack: 垂直堆叠放置(堆积柱形图)。
dodge: 水平抖动放置,簇状柱形图:position = position_dodge()。
fill: 百分比化(垂直堆叠放置,百分比面积图、百分比堆积柱形图等)
ggplot2 中位置调整参数
函数 | 功能 | 参数说明 |
---|---|---|
position_dodge() | 水平并列放置 | position_dodge(width=NULL, preserve=('total','single')),作用于簇状柱形图geom_bar()、箱形图geom_boxplot()等 |
position_identity() | 位置不变 | 对于散点图和折线图等可行,默认为 identity ,但对于多分类柱形图,序列间会存在掩盖。 |
position_stack() | 垂直堆叠 | position_stack(vjust=1,reverse=False) 柱形图 和 面积图 默认stack 堆叠。 |
position_fill() | 百分比填充 | position_fill(vjust=1,reverse=False) 垂直堆叠,但只能反映各组百分比 |
position_jitter() | 扰动处理 | position_jitter(width=NULL,height=NULL),部分重叠,用于做散点图 |
position_jitter dodge() | 并列扰动 | position_jitterdodge(jitter.width=NULL,jitter.height=0,dodge.width=0.75),仅仅由于箱型图和散点图在一起的情况,且必须箱型图在前 |
position_nudge() | 位置微调 | position_nudge(x=0,y=0),整体向 x 和 y 方向平移的距离,常用于 geom_text()文本对象。 |
箱型图和散点图扰动的位置变化
library(ggplot2)
n <- 100
df <- data.frame(group = rep(c(1,2),each=n*2),
y = append(append(rnorm(n,5,1),rnorm(n,2,1)),append(rnorm(n,1,1),rnorm(n,3,1))),)
x = rep(c('A','B','A','B'),n)
#--------------------------
p1 <- ggplot(df,aes(x=x,y=y,fill=as.factor(group)))+
geom_boxplot(outlier.size = 0,color='black')+
geom_jitter(aes(group=as.factor(group)),shape=21,alpha=0.5)
#--------------------------
p2 <- ggplot(df,aes(x=x,y=y,fill=as.factor(group)))+
geom_boxplot(outlier.size = 0,color='black')+
geom_jitter(aes(group=as.factor(group)),shape=21,alpha=0.5,
position = position_jitterdodge())
#--------------------------
p3 <- ggplot(df,aes(x=x,y=y,fill=as.factor(group)))+
geom_boxplot(position = position_dodge(0.75),
outlier.size = 0,color='black')+
geom_jitter(aes(group=as.factor(group)),shape=21,alpha=0.5,
position = position_jitterdodge(dodge.width = 0.75))
#--------------------------
library(gridExtra)
grid.arrange(p1,p2,p3,nrow=1,ncol=3)
总而言之,①要理解 ggplot() 和 geom_xxx() 之间的关系,其实 ggplot() 类似于全局变量,其作用效果在整个图形中都要起作用,经常作为因子分类等来应用,而 geom_xxx() 中的就是局部变量,只在该句中统一某一个图形要素,在实际作图中,要针对不同的情况进行使用。②整个基础语法的核心就在于 语法框架 中的几个重要的引导词和函数的理解,每一个引导函数都能完成对应的任务,里面可以填不同的参数,在学习中应该把握好框架,在实际应用中通过不断练习来填充框架,加深记忆。