生信自学网-速科生物-生物信息学数据库挖掘视频教程

主页 > 生信答疑 >

R-ggplot2包的介绍与学习(三)

R-ggplot2包的介绍与学习(三)

Chap4. 折线图

概述

折线图可以反映某种现象的趋势。通常折线图的横坐标是时间变量,纵坐标则是一般的数值型变量。当然,折线图也允许横纵坐标为离散型和数值型。

折线图通常用来对两个连续变量之间的相互依存关系进行可视化。其中x也可以是因子型变量。

简单折线图

geom_line()
  1. 对于因子型变量,必须使用aes(group=1)以确保ggplot()知道这些数据点属于同一个分组,从而应该用一条折线连在一起。
  2. 数据标记相互重叠:需要相应地左移或者右移连接线以避免点线偏离。geom_line(position=position_dodge(0.2))
  3. 参数:线型(linetype),线宽(size),颜色(colour):边框线
  4. aes()函数外部设定颜色、线宽、线型和点型等参数会将所有目标对象设定为同样的参数值。
  5. 面积图:geom_area(),alpha调节透明度
  6. 堆积面积图:geom_area()基础上,映射一个因子型比那里给填充色(fill)即可
  7. 添加置信域:geom_ribbon(),然后分贝映射一个变量给ymin和ymax。geom_ribbon(aes(ymin=xx,ymax=xx), alpha = 0.2)

一、绘制单条折线图

library(ggplot2)
library(lubridate) #处理日期时间相关的R包,非常有用,强烈推荐
Year <- year(seq(from = as.Date('2006-01-01'), to = as.Date('2015-01-01'), by = 'year'))
Weight <- c(23,35,43,57,60,62,63,66,61,62)
df <- data.frame(Year = Year, Weight = Weight)
ggplot(data = df, mapping = aes(x = factor(Year), y = Weight, group = 1)) + geom_line() + xlab('Year')

有关离散变量的折线图 

type <- c('A','B','C','D','E')
quanlity <- c(1,1.1,2.1,1.5,1.7)
df <- data.frame(type = type, quanlity = quanlity)
ggplot(data = df, mapping = aes(x = type, y = quanlity, group = 1)) + geom_line()

有关连续变量的折线图 

set.seed(1234)

times <- 1:15

value <- runif(15,min = 5,max = 15)

df <- data.frame(times = times, value = value)

ggplot(data = df, mapping = aes(x = times, y = value)) + geom_line()

善于发现的你,可能会注意到上面三段代码有一个重要的不同之处,那就是第一段和第二段代码中含有‘group = 1’的设置这样做是因为横坐标的属性设置为了因子,即将连续型的年份和离散型的字符转换为因子,如果不添加‘group = 1’这样的条件,绘图将会报错。故务必需要记住这里的易犯错误的点!

往折线图中添加标记(点) 当数据点密度比较小或采集分布(间隔)不均匀时,为折线图做上标记将会产生非常好的效果。处理的方法非常简单,只需在折线图的基础上再加上geom_point()函数即可。

set.seed(1234)

year <- c(1990,1995,2000,2003,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015)

value <- runif(15, min = 10, max = 50)

df <- data.frame(year = year, value = vlaue)

ggplot(data = df, mapping = aes(x = year, y = value)) + geom_line() + geom_point()

 

从图中就可以非常明显的看出,刚开始采集的点分布非常散,而后面采集的点就比较密集,这也有助于对图的理解和应用。

二、绘制多条折线图 上面绘制的都是单条这折线图,对于两个或两个以上的折线图该如何绘制呢?也很简单,只需将其他离散变量赋给诸如colour(线条颜色)和linetype(线条形状)的属性即可,具体参见下文例子。

基于颜色的多条折线图

set.seed(1234)
year <- rep(1990:2015, times = 2)
type <- rep(c('A','B'),each = 26)
value <- c(runif(26),runif(26, min = 1,max = 1.5))
df <- data.frame(year = year, type = type, value = value)
ggplot(data = df, mapping = aes(x = year, y = value, colour = type)) + geom_line()

基于形状的多条折线图

ggplot(data = df, mapping = aes(x = year, y = value, linetype= type)) + geom_line()

同样需要注意的是,在绘制多条折线图时,如果横坐标为因子,必须还得加上‘group=分组变量’的参数,否则报错或绘制出错误的图形。

以上绘制的折线图,均采用默认格式,不论是颜色、形状、大小还是透明度,均没有给出自定义的格式。其实ggplot2包也是允许用户根据自己的想法设置这些属性的。

自定义线条或点的颜色—scale_color_manual()

自定义线条类型—scale_linetype_manual()

自定义点的形状—scale_shape__manual()

自定义点的大小或线条的宽度—scale_size__manual()

自定义透明度—scale_alpha__manual()

综合的例子:


ggplot(data = df, mapping = aes(x = year, y = value, linetype = type, colour = type, shape = type, fill = type))

+ geom_line() + geom_point() #绘制线图和点图

+ scale_linetype_manual(values = c(1,2)) #自定义线条类型

+ scale_color_manual(values = c('steelblue','darkred')) #自定义颜色

+ scale_shape_manual(values = c(21,23)) #自定义点形状

+ scale_fill_manual(values = c('red','black')) #自定义点的填充色

虽然这幅图画的优点夸张,目的是想说明可以通过自定义的方式,想怎么改就可以怎么改。前提是aes()属性的内容与自定义的内容对应上。

三、绘制堆积面积图

绘制堆叠的面积图只需要geom_area()函数再加上一个离散变量映射到fill就可以轻松实现,先忙咱小试牛刀一下。

set.seed(1234)
year <- rep(1990:2015, times = 2)
type <- rep(c('A','B'),each = 26)
value <- c(runif(26),runif(26, min = 1,max = 1.5))
df <- data.frame(year = year, type = type, value = value)
ggplot(data = df, mapping = aes(x = year, y = value, fill = type)) + geom_area()

一幅堆叠的面积图就轻松绘制成功,但我们发现,堆叠的顺序与图例的顺序恰好相反,不用急,只需要加一句命令即可:

ggplot(data = df, mapping = aes(x = year, y = value, fill = type)) + geom_area() + guides(fill = guide_legend(reverse = TRUE))

如果需要为每一块面积图的顶部加上一条直线,可以通过如下两种方式:

ggplot(data = df, mapping = aes(x = year, y = value, fill = type)) + geom_area(colour = 'black', size =1, alpha = .7) + guides(fill = guide_legend(reverse = TRUE))

其中,colour设置面积图边框的颜色;size设置边框线的粗细;alpha设置面积图和边框线的透明度。

ggplot(data = df, mapping = aes(x = year, y = value, fill = type)) + geom_area(alpha = 0.6) + geom_line(colour = 'black', size = 1, position = 'stack', alpha = 0.6) + guides(fill = guide_legend(reverse = TRUE))

该方法是通过添加堆叠线条(必须设置geom_line()中position参数为‘stack’,否则只是添加了两条线,无法与面积图的顶部重合)。这两幅图的区别在于第二种方式没有绘制面积图左右边框和底边框。在实际应用中,建议不要在面积图中绘制边框线,因为边框的存在可能产生误导

四、绘制百分比堆积面积图

在面积图中,也可以方便快捷的绘制出百分比堆积面积图,具体操作如下:

set.seed(1234)
year <- rep(1990:2015, times = 4)
type <- rep(c('A','B','C','D'),each = 26)
value <- c(runif(26),runif(26, min = 1,max = 1.5), runif(26, min = 1.5,max = 2), runif(26, min = 2,max = 2.5))
df <- data.frame(year = year, type = type, value = value)
ggplot(data = df, mapping = aes(x = year, y = value, fill = type)) + geom_area(position = 'fill', alpha = 0.6) + guides(fill = guide_legend(reverse = TRUE))

但通过这种方式(设置面积图的positon='fill')存在一点点小缺陷,即无法绘制出百分比堆积面积图顶部的线条,该如何实现呢?这里只需要对原始数据集做一步汇总工作,让后按部就班的绘制面积图即可。

 library(dplyr)

df_by_type <- group_by(.data = df, year)

df_summarize <- mutate(.data = df_by_type, value2 = value/sum(value))

有关dplyr包的用法可参考: 

强大的dplyr包实现数据预处理

ggplot(data = df_summarize, mapping = aes(x = year, y = value2, fill = type)) + geom_area(alpha = 0.6) + geom_line(colour = 'black', size = 1, position = 'stack', alpha = 0.6) + guides(fill = guide_legend(reverse = TRUE))

这样就大功告成了!

Chap5. 散点图

概述

散点图通常用来刻画两个连续型变量之间的关系。

散点图

geom_point()
  1. 参数值:shape(),size=2,colour()
  2. 更改配色与点形:scale_colour/shape_brewer/manual()
  3. 尽量将不需要高精度的变量映射给图形的大小和颜色属性。
  4. 调用scale_size_area()函数使数据点的面积正比于变量值。
  5. 处理图形重叠问题(overplotting):
    • 使用半透明的点
    • 将数据分箱(bin),并用矩形表示(适用于量化分析)stat_bin2d()
    • 将数据分箱(bin),并用六边形表示stat_binhex(packages:”hexbin”)
    • 使用箱线图
    • 离散x:调用geom_point(position_jitter())函数给数据点增加随机扰动。
  6. 添加回归模型拟合线:stat_smooth(method=lm,level=0.95)
  7. 添加自己构建的模型拟合线:geom_line(data=predicted,size=1)
  8. dlply()ldply()函数:切分数据,对各个部分执行某一函数,并对执行结果进行重组。
  9. 散点图中添加模型系数:+ annotate(parse = TRUE)函数添加文本。利用expression()检验输出结果
  10. 添加边际地毯(Marginal rugs):geom_rug()
  11. 添加标签:geom_text(aes(label=xxx),size=xx,x=xx+0.1)
    • vjust=1:标签文本的顶部与数据点对齐
    • vjust=0:标签文本的底部与数据点对齐
    • hjust=1/0:右对齐/左对齐
    • 通常先设定hjust()vjust()的值为0或1,然后再调整x或y的值来调整文本标签的位置.
    • 对数坐标轴:需令x或者y乘以一个数值才可以。
    • 去掉不需要的标签:将不需要刻画出来的标签赋值为NA
  12. 绘制气泡图:geom_point()scale_size_area(max_size=15)
  13. 散点图矩阵:base基础绘图系统,pairs()

散点图通常用来刻画两个连续型变量之间的关系,数据集中的每一条观测都由散点图中的一个点来表示。在散点图中也可以加入一些直线或曲线,用来表示基于统计模型的拟合。当数据集记录很多时,散点图可能会彼此重叠,这种情况往往需要一些预处理操作。

1 基本散点图

散点图可以用来描述两个连续变量之间的关系,一般在做数据探索分析时会使用到,通过散点图发现变量之间的相关性强度、是否线性关系等。 

使用geom_point()绘制散点图,并分别映射一个变量到x和y。

基本散点图

可以使用shape和size分别指定点型和点的大小,如果点型包括填充和描边的话,可用fill和color分别指定填充色和描边色。

2 基于类别型变量分组

可将分组变量(因子或字符变量)赋值给颜色或形状属性,实现分组散点图的绘制

可以将因子和字符串等类别型变量映射到散点的颜色或形状。

分组散点图

 

set.seed(112)
x <- rnorm(100,mean = 2,sd = 3)
y <- 1.5+2*x+rnorm(100)
z <- sample(c(0,1),size = 100,replace = TRUE)
df <- data.frame(x = x,y = y,z = z)
# 将数值型变量转换为因子型变量
df$z <- factor(df$z)

#分组变量赋值给颜色属性
ggplot(df,aes(x = x,y = y,colour = z))+
geom_point(size = 3)

#分组变量赋值给形状属性
ggplot(df,aes(x = x,y = y,shape = z))+
geom_point(size = 3)

# 分组变量同时赋给颜色属性和形状属性
ggplot(df,aes(x = x,y = y,shape = z,colour = z))+
geom_point(size = 3)+
scale_color_brewer(palette = "Accent")+
scale_shape_manual(values = c(2,16))

注意点的形状,21-25之间的点的形状,既可以赋值边框颜色,又可以赋值填充色。

将离散型变量或因子映射给颜色属性或形状属性

x <- c(10,13,11,15,18,20,21,22,24,26)
y <- c(76,60,70,58,55,48,44,40,26,18)
z <- c(100,120,300,180,80,210,30,95,145,420)
df <- data.frame(x = x,y = y,z = z)
# 将连续型变量映射给颜色属性
ggplot(df,aes(x = x,y = y,colour = z))+
  geom_point(size = 3)

图例上,颜色越深而对应的值越小,如何将值的大小与颜色的深浅保持一致?只需要人为的设置色阶,从低到高设置不同的颜色即可

3 基于连续型变量映射

当然,还可以将连续型变量映射到散点的颜色或大小等存在渐变的属性上,从而呈现三个连续型变量之间的关系。其中人眼对于x轴和y轴所对应变量的变化更为敏感,而对颜色和大小的变化则不那么敏感。 

连续散点图

同时映射类别型变量和连续型变量,并设置散点的面积正比于连续型变量的大小,默认为非线性映射。

多种映射

# 将连续型变量映射给颜色属性,同时设置双色梯度
ggplot(df,aes(x = x,y = y,colour = z))+geom_point(size = 3)+scale_colour_gradient(low = "lightblue",high = "darkblue")

# 将连续变量映射给大小属性
ggplot(df,aes(x = x,y = y,size = z))+ geom_point()

# 将连续型变量赋给颜色属性或大小属性,自定义双色梯度,色阶间隔顺序由低到高
ggplot(df,aes(x = x,y = y,fill = z))+ geom_point(shape = 21,size = 3)+
scale_fill_gradient(low = "lightblue",high = "darkblue",breaks = c(100,150,200,300,350,400))

# 自定义球大小的间隔
ggplot(df,aes(x = x,y = y,size = z))+geom_point()+
scale_size_continuous(breaks = c(100,150,200,250,300,350,400),guide = guide_legend())
# scale_size(breaks = c(100,150,200,250,300,350,400))结果一样

# 将连续变量值的大小与球的大小成比例
ggplot(df,aes(x = x,y = y,size = z))+geom_point()+scale_size_area(max_size = 10)
# scale_size_area()可以确保数值0映射为0,max_size保证映射最大的点的大小

 4 处理散点重合

以下为六边形分箱的结果。

六边形分箱

当x轴和y轴对应一个或两个离散型变量时,例如虽然对应数值,但是数值仅取某些离散点,可以给散点图添加扰动,使得散点分离开来。 

 5 添加拟合线

使用stat_smooth()或geom_smooth()添加拟合线和置信域。 

以下使用Logistic回归拟合一个二分类的样本,可以看出V1和classn具有二分类关系,Logistic回归曲线也说明了这一点。 

Logistic回归

如果已经将类别型变量映射到散点的颜色或形状,则在添加拟合线时会分别为每一组添加一条拟合线。可以看到身高随着年龄增长而增加,到一定年龄后停止增长,且男性比女性平均身高更高。

分组拟合

散点图矩阵

散点图矩阵用于展示多幅散点图,pairs()函数可以创建基础的散点图矩阵,以下代码包含mpg、disp、drat和wt中任意两者的散点图。

pairs()函数创建的散点图矩阵

car包的scatterplotMatrix()函数也可以生成散点图矩阵,并支持以下操作:

  • 以某个因子为条件绘制散点图矩阵;
  • 包含线型和平滑拟合曲线;
  • 在主对角线放置箱线图、密度图或者直方图;
  • 在各单元格的边界添加轴须图。

spread=FALSE选项表示不添加展示分散度和对称信息的直线。

scatterplotMatrix()函数

再来一个scatterplotMatrix()函数的使用例子,主对角线的核密度曲线改为了直方图,并且直方图以汽车气缸数为条件绘制。 

scatterplotMatrix()函数另一个例子

gclus包中的cpairs()函数提供了一个有趣的散点图矩阵变种,支持重排矩阵中变量的位置,让相关性更高的变量更靠近主对角线,还可以对各单元格进行颜色编码来展示变量间的相关性大小。

首先查看各个变量之间相关性的大小:

可以发现相关性最高(0.89)的是车重(wt)和排量(disp),以及车重(wt)和每加仑英里数(mpg)。相关性最低(0.68)的是每加仑英里数(mpg)和后轴比(drat)。以下代码根据相关性大小,对散点图矩阵中的这些变量重新排序并着色。

按相关性排序并着色后的散点图矩阵

高密度散点图

当散点图中点数量过大时,数据点的重叠将会导致绘图效果显著变差。对于这种情况,可以使用封箱、颜色和透明度等来指定图中任意点上重叠点的数目。

smoothScatter()函数可利用核密度估计生成用颜色密度来表示点分布的散点图。

smoothScatter

hexbin包中的hexbin()函数将二元变量的封箱放到六边形单元格中。

hexbin包中的hexbin()函数

IDPmisc包中的iplot()函数也可以通过颜色来展示点的密度。 

 

IDPmisc包中的iplot()函数

三维散点图

如果想一次性对三个定量变量的交互进行可视化,那么可以使用scatterplot3d中的scatterplot3d()函数进行绘制。

最基本的三维散点图

scatterplot3d()函数提供了许多选项,包括设置图形符号、轴、颜色、线条、网格线、突出显示和角度等功能。例如以下代码生成一幅突出显示效果的三维散点图,增强了纵深感并添加了连接点与水平面的垂直线。

带纵深效果和垂直线的三维散点图

还可以再加上一个回归面。

使用rgl包中的plot3d()函数可创建交互式的三维散点图,通过鼠标即可对图形进行旋转。

Rcmdr包中的scatter3d()函数可以实现类似功能。

6 添加文本标注

使用geom_text()为散点图添加标注,vjust为0时表示竖直方向上基线对齐,为1时表示顶部对齐,hjust为0时表示水平方向上左对齐,为1时表示右对齐,以下设置对齐方式并适当添加偏移,以改善显示效果。 

添加文本标注

7 使用气泡图绘制二维统计

以下使用散点图绘制气泡图,对两个类别型变量进行统计。

气泡图二维统计

 

value1 <- rep(c('高价值','中价值','低价值'), each = 3)
value2 <- rep(c('高价值','中价值','低价值'), times = 3)
nums <- c(500,287,123,156,720,390,80,468,1200)
df <- data.frame(value1 = value1, value2 = value2, nums = nums)
df$value1 <- factor(df$value1, levels = c('高价值','中价值','低价值'), order = TRUE)
df$value2 <- factor(df$value2, levels = c('低价值','中价值','高价值'), order = TRUE)
ggplot(df,aes(x = value1, y = value2, size = nums)) +geom_point(colour = 'steelblue') +
scale_size_area(max_size = 30, guide = FALSE) +geom_text(aes(label = nums), vjust = 0, colour = 'black', size = 5) + theme(text = element_text(family = 'SimSun'))


绘制气泡图也可使用函数symbols(x,y,circle=r).当中x、y是坐标轴,r是每一个点的半径。
x<-rnorm(6)
y<-rnorm(6)
r<-abs(rnorm(6))
symbols(x,y,circle = r, bg=rainbow(6))

###############气泡图例子2
attach(mtcars) # 激活或挂接数据集 
#attach( )函数是将数据框添加到R的搜索路径中 # mtcars为R语言内置数据集
r<-sqrt(disp/pi)
symbols(wt,mpg,circle=r, inches=0.3, bg="lightblue")
text(wt,mpg,row.names(mtcars), cex=0.5) #给每一个气泡加上文字。

 


(责任编辑:伏泽   微信:18520221056)

森莘老师微信二维码