vlambda博客
学习文章列表

数据可视化 | 使用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个特殊函数。

数据可视化 | 使用R语言绘制专业图表(Ⅰ)——ggplot2 图形语法基础

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 计算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语言绘制专业图表(Ⅰ)——ggplot2 图形语法基础

视觉通道示例图(使用了《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中。

数据可视化 | 使用R语言绘制专业图表(Ⅰ)——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 的度量调整]。

数据可视化 | 使用R语言绘制专业图表(Ⅰ)——ggplot2 图形语法基础

不同度量的调整效果

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)

合理的使用通道映射参数,并调整合适的度量,是进行绘图的重要点。可视化最基本的形式就是简单的把数据映射为彩色图形,它的工作原理就像大脑倾向于寻找模式,可以在图形和它所代表的数字之间进行切换。一般情况下人们理解视觉暗示的精确程度是:

位置 > 长度 > 角度 > 方向 > 面积 > 体积 > 饱和度 > 色相 > 纹理 > 形状

在绘图过程中选择正确的视觉暗示取决于对形状、颜色、大小的理解,以及 数据本身要表达的目标。不同的图表应该要选择不同的视觉暗示,合理的视觉暗示组合能够更好的促进别人理解图表的数据信息。

数据可视化 | 使用R语言绘制专业图表(Ⅰ)——ggplot2 图形语法基础

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() 坐标轴的刻度比例尺是变化的,应用较少,但是在部分数据集中比较常用。

数据可视化 | 使用R语言绘制专业图表(Ⅰ)——ggplot2 图形语法基础

普通直角坐标系(二维散点图+二维气泡图)

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() 函数实现平行坐标系的绘制。

数据可视化 | 使用R语言绘制专业图表(Ⅰ)——ggplot2 图形语法基础

三维直角坐标系

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 坐标系的转换

选择合适的坐标系有利于数据的清晰表达,极坐标系可以非常清楚的看到数据在周期和方向上的变化趋势,而对连续时间段的变化却不如直角坐标系。

数据可视化 | 使用R语言绘制专业图表(Ⅰ)——ggplot2 图形语法基础

从直角坐标系转为为极坐标系(《数据可视化之美》配套数据)

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 坐标轴度量

坐标系指定了可视化的维度,而坐标轴的度量则指定了在每一个维度里数据映射的范围。大体来说坐标轴可以分为三类:数字坐标轴、分类坐标轴、时间坐标轴。

数据可视化 | 使用R语言绘制专业图表(Ⅰ)——ggplot2 图形语法基础

坐标轴度量的大体分类

其中,在这些函数里面大体都会有以下的参数,每个参数的名称及内涵整理如下:

参数 参数内涵
name 表示坐标轴的名称,也将作为对应的图例名
breaks 表示指定坐标轴刻度位置,即粗网格线位置
label 表示指定坐标轴刻度标签内容
limits 表示指定坐标轴的显示范围,支持反区间
expand 表示扩展坐标轴显示范围
trans 表示指定坐标轴变换函数,exp()、log()、log10()

示例:转换坐标轴度量

数据可视化 | 使用R语言绘制专业图表(Ⅰ)——ggplot2 图形语法基础

直角坐标系度量的调整

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之间。

数据可视化 | 使用R语言绘制专业图表(Ⅰ)——ggplot2 图形语法基础

图例位置的调整

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() 中的就是局部变量,只在该句中统一某一个图形要素,在实际作图中,要针对不同的情况进行使用。②整个基础语法的核心就在于 语法框架 中的几个重要的引导词和函数的理解,每一个引导函数都能完成对应的任务,里面可以填不同的参数,在学习中应该把握好框架,在实际应用中通过不断练习来填充框架,加深记忆。