R-ggplot2包的介绍与学习(三)
时间:2020-08-11 来源:生信自学网 作者:刘鑫
微信公众号:biowolf_cn 点击:次
R-ggplot2包的介绍与学习(三)
|
1
2
|
library(gcookbook)
ggplot(heightweight, aes(x=ageYear, y=heightIn)) + geom_point()
|
可以使用shape和size分别指定点型和点的大小,如果点型包括填充和描边的话,可用fill和color分别指定填充色和描边色。
2 基于类别型变量分组
可将分组变量(因子或字符变量)赋值给颜色或形状属性,实现分组散点图的绘制
可以将因子和字符串等类别型变量映射到散点的颜色或形状。
1
2
|
library(gcookbook)
ggplot(heightweight, aes(x=ageYear, y=heightIn, shape=sex, color=sex)) + geom_point()
|
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轴所对应变量的变化更为敏感,而对颜色和大小的变化则不那么敏感。
1
2
|
library(gcookbook)
ggplot(heightweight, aes(x=ageYear, y=heightIn, size=weightLb, color=weightLb)) + geom_point()
|
同时映射类别型变量和连续型变量,并设置散点的面积正比于连续型变量的大小,默认为非线性映射。
1
2
|
library(gcookbook)
ggplot(heightweight, aes(x=ageYear, y=heightIn, size=weightLb, color=sex)) + geom_point(alpha=.5) + scale_size_area()
|
# 将连续型变量映射给颜色属性,同时设置双色梯度
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 处理散点重合
处理散点重合的基本思路包括:
当数据点非常多时,可能会导致数据点重叠严重,处理方法如下:
1)使用半透明的点
2)数据分箱,并用矩形表示{stat_bin2d()}
3)数据分箱,并用六边形表示{stat_binhex()}
4)使用二维密度估计,并将等高线添加到散点图中{stat_density2d()}
5)向散点图中添加边际地毯
set.seed(112)
x <- rnorm(10000)
y <- rnorm(10000,0,2)
df <- data.frame(x = x,y = y)
# 不作任何处理
ggplot(df,aes(x = x,y = y))+
geom_point()
# 使用透明度处理点的重叠问题
ggplot(df,aes(x = x,y = y))+geom_point(alpha = 0.1)
# 分箱,并用矩阵表示
ggplot(df,aes(x = x,y = y))+stat_bin2d()
默认情况下,stat_bin2d()函数将x轴和y轴的数据点各分位30段,即参数900个箱子;用户还可以自定义分段个数,以及箱子在垂直和水平方向上的宽度。
# 设置bins为50,
ggplot(df,aes(x = x,y = y))+stat_bin2d(bins = 50)+scale_fill_gradient(low = "steelblue",high = "darkred",limits = c(0,100),breaks = c(0,25,50,100))
分箱的具体做法是,将点分箱,并统计每个箱中点的个数,然后通过某种方法可视化这个数量。
# 分箱,用六边形表示,箱子水平和竖直方向的宽度各为0.2,0.3;
# 图例标度范围0-100,显示在图例上的值(0,25,50,100)
ggplot(df,aes(x = x,y = y))+stat_bin_hex(binwidth = c(0.2,0.3))+
scale_fill_gradient(low = "lightgreen",high = "darkred",limits=c(0,100),breaks = c(0,25,50,100))
# 使用stat_density2d作二维密度估计,并将等高线添加到散点图中
ggplot(df,aes(x = x,y = y))+geom_point()+stat_density2d()
#使用大小与分布密度成正比例的点,不添加等高线
ggplot(df,aes(x = x, y = y)) +stat_density2d(geom = 'point', aes(size = ..density..),contour = FALSE) + scale_size_area()
#使用瓦片图展示数据分布密度情况
ggplot(df,aes(x = x, y = y)) + stat_density2d(geom = 'tile',aes(fill = ..density..),contour = FALSE)
#向散点图中添加边际地毯(轴须线)
ggplot(faithful,aes(x = eruptions, y = waiting)) + geom_point() + geom_rug()
#通过边际地毯,可以快速查看每个坐标轴上数据的分布密疏情况。还可以通过向边际地毯线的位置坐标添加扰动并设定size减少线宽,从而减轻边际地毯线的重叠程度。
ggplot(faithful, aes(x = eruptions, y = waiting)) +geom_point() +geom_rug(position = 'jitter', size = 0.1)
- 设置透明度;
- 使用矩形和六边形等分箱,并且用颜色表示密度。
1
2
3
4
5
6
7
8
9
10
11
|
sp <- ggplot(diamonds, aes(x=carat, y=price))
# 未处理
sp + geom_point()
# 设置透明度
sp + geom_point(alpha=.1)
sp + geom_point(alpha=.01)
# 矩形分箱并设置渐变颜色
sp + stat_bin2d(bins=50) + scale_fill_gradient(low="lightblue", high="red")
# 六边形分箱并设置渐变颜色
install.packages("hexbin")
sp + stat_binhex() + scale_fill_gradient(low="lightblue", high="red")
|
以下为六边形分箱的结果。
当x轴和y轴对应一个或两个离散型变量时,例如虽然对应数值,但是数值仅取某些离散点,可以给散点图添加扰动,使得散点分离开来。
1
2
3
4
5
6
7
|
sp <- ggplot(ChickWeight, aes(x=Time, y=weight))
# 未处理
sp + geom_point()
# 添加扰动
sp + geom_point(position="jitter")
# 仅添加水平方向上的扰动
sp + geom_point(position=position_jitter(width=.5, height=0))
|
5 添加拟合线
使用stat_smooth()或geom_smooth()添加拟合线和置信域。
1
2
3
4
5
6
7
8
9
10
11
12
|
library(gcookbook)
sp <- ggplot(heightweight, aes(x=ageYear, y=heightIn))
# 默认,loess局部加权多项式拟合
sp + geom_point() + stat_smooth()
# 线性拟合,95%置信域
sp + geom_point() + stat_smooth(method=lm)
# 99%置信域
sp + geom_point() + stat_smooth(method=lm, level=0.99)
# 不加置信域
sp + geom_point() + stat_smooth(method=lm, se=FALSE)
# 修改配色
sp + geom_point(color="grey60") + stat_smooth(method=lm, se=FALSE, color="black")
|
以下使用Logistic回归拟合一个二分类的样本,可以看出V1和classn具有二分类关系,Logistic回归曲线也说明了这一点。
1
2
3
4
5
6
|
library(MASS)
b <- biopsy
b$classn[b$class=="benign"] <- 0
b$classn[b$class=="malignant"] <- 1
head(b)
ggplot(b, aes(x=V1, y=classn)) + geom_point(position=position_jitter(width=.3, height=.06), alpha=.4, shape=21, size=1.5) + geom_smooth(method="glm", method.args=list(family="binomial"))
|
如果已经将类别型变量映射到散点的颜色或形状,则在添加拟合线时会分别为每一组添加一条拟合线。可以看到身高随着年龄增长而增加,到一定年龄后停止增长,且男性比女性平均身高更高。
1
|
ggplot(heightweight, aes(x=ageYear, y=heightIn, color=sex)) + geom_point() + scale_color_brewer(palette="Set1") + geom_smooth()
|
散点图矩阵
散点图矩阵用于展示多幅散点图,pairs()函数可以创建基础的散点图矩阵,以下代码包含mpg、disp、drat和wt中任意两者的散点图。
1
|
pairs(~ mpg + disp + drat + wt, data=mtcars, main="Basic Scatter Plot Matrix")
|
car包的scatterplotMatrix()函数也可以生成散点图矩阵,并支持以下操作:
- 以某个因子为条件绘制散点图矩阵;
- 包含线型和平滑拟合曲线;
- 在主对角线放置箱线图、密度图或者直方图;
- 在各单元格的边界添加轴须图。
1
2
|
library(car)
scatterplotMatrix(~ mpg + disp + drat + wt, data=mtcars, spread=FALSE, lty.smooth=2, main="Scatter Plot Matrix via car Package")
|
spread=FALSE选项表示不添加展示分散度和对称信息的直线。
再来一个scatterplotMatrix()函数的使用例子,主对角线的核密度曲线改为了直方图,并且直方图以汽车气缸数为条件绘制。
1
2
|
library(car)
scatterplotMatrix(~ mpg + disp + drat + wt|cyl, data=mtcars, spread=FALSE, diagonal="histogram", main="Scatter Plot Matrix via car Package")
|
gclus包中的cpairs()函数提供了一个有趣的散点图矩阵变种,支持重排矩阵中变量的位置,让相关性更高的变量更靠近主对角线,还可以对各单元格进行颜色编码来展示变量间的相关性大小。
首先查看各个变量之间相关性的大小:
1
|
cor(mtcars[c("mpg", "wt", "disp", "drat")])
|
可以发现相关性最高(0.89)的是车重(wt)和排量(disp),以及车重(wt)和每加仑英里数(mpg)。相关性最低(0.68)的是每加仑英里数(mpg)和后轴比(drat)。以下代码根据相关性大小,对散点图矩阵中的这些变量重新排序并着色。
1
2
3
4
5
6
|
library(gclus)
mydata <- mtcars[c(1,3,5,6)]
mydata.corr <- abs(cor(mydata))
mycolors <- dmat.color(mydata.corr)
myorder <- order.single(mydata.corr)
cpairs(mydata, myorder, panel.colors=mycolors, gap=.5, main="Variables Ordered and Colored by Correlation")
|
高密度散点图
当散点图中点数量过大时,数据点的重叠将会导致绘图效果显著变差。对于这种情况,可以使用封箱、颜色和透明度等来指定图中任意点上重叠点的数目。
smoothScatter()函数可利用核密度估计生成用颜色密度来表示点分布的散点图。
1
2
3
4
5
6
7
8
|
set.seed(1234)
n <- 10000
c1 <- matrix(rnorm(n ,mean=0, sd=.5), ncol=2)
c2 <- matrix(rnorm(n, mean=3, sd=2), ncol=2)
mydata <- rbind(c1, c2)
mydata <- as.data.frame(mydata)
names(mydata) <- c("x", "y")
smoothScatter(mydata$x, mydata$y, main="Scatterplot Colored by Smoothed Densities")
|
hexbin包中的hexbin()函数将二元变量的封箱放到六边形单元格中。
1
2
3
|
library(hexbin)
bin <- hexbin(mydata$x, mydata$y, xbins=50)
plot(bin, main="Hexagonal Binning with 10000 Observations")
|
IDPmisc包中的iplot()函数也可以通过颜色来展示点的密度。
1
2
|
library(IDPmisc)
iplot(mydata$x, mydata$y, main="Image Scatter Plot with Color Indicating Density")
|
三维散点图
如果想一次性对三个定量变量的交互进行可视化,那么可以使用scatterplot3d中的scatterplot3d()函数进行绘制。
1
2
3
4
|
library(scatterplot3d)
attach(mtcars)
scatterplot3d(wt, disp, mpg, main="Basic 3D Scatter Plot")
detach(mtcars)
|
scatterplot3d()函数提供了许多选项,包括设置图形符号、轴、颜色、线条、网格线、突出显示和角度等功能。例如以下代码生成一幅突出显示效果的三维散点图,增强了纵深感并添加了连接点与水平面的垂直线。
1
2
3
4
|
library(scatterplot3d)
attach(mtcars)
scatterplot3d(wt, disp, mpg, pch=16, highlight.3d=TRUE, type="h", main="3D Scatter Plot with Vertical Lines")
detach(mtcars)
|
还可以再加上一个回归面。
1
2
3
4
5
6
|
library(scatterplot3d)
attach(mtcars)
s3d <- scatterplot3d(wt, disp, mpg, pch=16, highlight.3d=TRUE, type="h", main="3D Scatter Plot with Vertical Lines and Regression Plane")
fit <- lm(mpg ~ wt + disp)
s3d$plane3d(fit)
detach(mtcars)
|
使用rgl包中的plot3d()函数可创建交互式的三维散点图,通过鼠标即可对图形进行旋转。
1
2
3
4
|
library(rgl)
attach(mtcars)
plot3d(wt, disp, mpg, col="red", size=5)
detach(mtcars)
|
Rcmdr包中的scatter3d()函数可以实现类似功能。
1
2
3
4
|
library(Rcmdr)
attach(mtcars)
scatter3d(wt, disp, mpg)
detach(mtcars)
|
6 添加文本标注
使用geom_text()为散点图添加标注,vjust为0时表示竖直方向上基线对齐,为1时表示顶部对齐,hjust为0时表示水平方向上左对齐,为1时表示右对齐,以下设置对齐方式并适当添加偏移,以改善显示效果。
1
|
ggplot(subset(countries, Year==2009 & healthexp>2000), aes(x=healthexp, y=infmortality)) + geom_point() + geom_text(aes(y=infmortality+.1, label=Name), size=4, vjust=0)
|
7 使用气泡图绘制二维统计
以下使用散点图绘制气泡图,对两个类别型变量进行统计。
1
2
3
4
|
hec <- HairEyeColor[,,"Male"] + HairEyeColor[,,"Female"]
library(reshape2)
hec <- melt(hec, value.name="count")
ggplot(hec, aes(x=Eye, y=Hair)) + geom_point(aes(size=count), shape=21, color="black", fill="cornsilk") + scale_size_area(max_size=20, guide=FALSE) + geom_text(aes(y=as.numeric(Hair)-sqrt(count)/22, label=count), vjust=1, color="grey60", size=4)
|
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)
