一、简介
上一篇中我们介绍了ggplot2的基本语法规则,为了生成各种复杂的叠加图层,需要了解ggplot2中一些基本的几何图形的构造规则,本文便就常见的基础几何图形进行说明;
二、各基础图形
2.1 abline)、hline)与vline)
在R的基础绘图系统中我们可以在已绘制的图床上通过abline来添加线条,在ggplot2中当然也有类似的方法:
geom_abline):
我们主要使用两个参数控制线条的位置,slope控制斜率,intercept控制截距,下面是一个简单的例子,我们在散点图层上叠加截距为20,斜率为2的直线:
libraryggplot2) p <- ggplotmtcars, aeswt, mpg)) + geom_point) + geom_ablineintercept = 20,slope = 2) p
geom_vline):
如果你想添加的直线垂直于x轴,则可以使用geom_vline)来快捷地添加垂直线条,xintercept传入的参数即为线条在x轴上的位置,若传入向量则可同时添加多条线条:
libraryggplot2) p <- ggplotmtcars, aeswt, mpg)) + geom_point) + geom_vlinexintercept = 5) p
p <- ggplotmtcars, aeswt, mpg)) + geom_point) + geom_vlinexintercept = 1:5) p
geom_hline):
同样的,我们通过在geom_hline)中传入参数yintercept来绘制垂直于y轴的线条:
p <- ggplotmtcars, aeswt, mpg)) + geom_point) + geom_hlineyintercept = 20) p
p <- ggplotmtcars, aeswt, mpg)) + geom_point) + geom_hlineyintercept = 15:25) p
2.2 area)
面积图也是一种很常用的图,多用于表现某些水平或比例类指标随时间的变化情况,下面是一个朴素的例子,以huron湖水水平变化数据为例:
libraryggplot2) p <- ggplothuron,aesx=year,y=level))+ geom_areafill='springgreen') p
实际上面积图最有表现力的类型是堆积面积图,下面以美国5个消费指标上5个年份的数据为例绘制堆积面积图:
libraryggplot2) libraryreshape2) #将原数据转置以处理成行对应一个年份的形式 data <- data.frametUSPersonalExpenditure)) #添加年份变量 data$year <- as.numericrow.namesdata)) #利用reshape2中的melt函数按照year列将原数据集伸展为“年份、变量名、对应数值”的形式 data <- meltdata, id='year') h <- ggplotdata, aesx=year, y=value))+ geom_areaaesfill=variable),position = 'fill')+ themelegend.position = 'bottom')+ labstitle='堆积面积图')+ themeplot.title = element_texthjust=0.5)) h
这样得到的图就比较具有美感和表现力,当然我们更改position参数也可以得到真实的水平逐年变化情况:
h <- ggplotdata, aesx=year, y=value))+ geom_areaaesfill=variable),position = 'identity')+ themelegend.position = 'bottom')+ labstitle='堆积面积图')+ themeplot.title = element_texthjust=0.5)) h
2.3 bar)
基础的条形图我们前面一篇中已经涉及到了,所以这里我们只与上述的堆积面积图进行对比,这里注意,geom_bar)默认的统计变换为count,即计算频数,我们这里想展示真实数值需要将geom_bar)中的stat设置为’identity’,即不做任何变换:
libraryggplot2) libraryreshape2) data <- data.frametUSPersonalExpenditure)) data$year <- row.namesdata) data <- meltdata, id='year') p <- ggplotdata, aesx=year,y=value))+ geom_baraesfill=factorvariable)),stat = 'identity')+ labstitle='消费水平')+ themeplot.title=element_texthjust=0.5)) p
可以看出这时我们的堆叠条形图便而可以看作离散的堆积面积图;
2.4 bin2d)
二维热图也是一种非常实用的图像,我们可以用来一览数据的某两个变量上的指标分布情况:
libraryggplot2) d <- ggplotdiamonds, aesx, y))+ geom_bin2d)+ labstitle='钻石长宽分布')+ themeplot.title=element_texthjust=0.5)) d
我们还可以利用bin2d)来直观的了解数据集的缺失情况:
libraryggplot2) libraryreshape2) #载入数据 data <- airquality #统计缺失值位置并保存为矩阵 na.count <- is.nadata[,-6]) #用1表示缺失,0表示未缺失 na.count[na.count == T] <- 1 na.count[na.count == F] <- 0 #将Day按列与na.count拼接并转为数据框 na.count <- data.framecbindna.count,data[,6])) namesna.count) <- namesairquality) #利用melt以Day为b na.count <- meltna.count,id='Day') #绘制数据集缺失情况概括图,以变量名为分面依据 p <- ggplotna.count,aesx=Day,y=value))+ geom_bin2d)+ facet_gridfacets = .~variable) p
2.5 density)与density2d)
很多时候当我们获取的数据集样本数量足够时,通常我们可以绘制密度估计图来大致描述数据集数据的分布,ggplot2中当然提供了这类方法,我们先从一维的说起:
geom_density):
和R基本绘图系统中的密度曲线绘制方法很接近:
libraryggplot2) data <- data.framematrixrnorm200),nrow=100)) v <- ggplotdata, aesx=X1))+ geom_densityalpha=0.3,fill='springgreen',colour='springgreen') v
geom_density2d):
和density)类似,只是我们可以通过density2d来绘制二维变量的概率密度分布:
v <- ggplotdata, aesX1, X2))+ geom_point)+ stat_density2daescolour=..level..)) v
也可以不绘制等高线,将..density..作为fill的传入参数,注意这里一定要设置contour为F:
# 密度图函数,通过fill设置填充颜色数据为密度,geom设置绘制栅格图 p <- ggplotdata, aesx = X1, y = X2)) + stat_density2daesfill = ..density..), geom = "raster", contour = F) p
或是在透明度alpha上动手脚:
# 密度图函数:alpha设置填充透明度数据为密度,geom设置绘制栅格图 p <- ggplotdata, aesx = X1, y = X2)) + geom_point) + stat_density2daesalpha = ..density..), geom = "raster", contour = FALSE) p
2.6 boxplot)
在统计学描述数据分布的图形中,箱线图是非常有代表性的,它通过图形表现五数概括的情况,在数据基本的描述性统计中具有重要意义,而ggplot2中必然可以绘制箱线图,而且可以绘制得非常精美,下面先看一个最朴素的分组箱线图形式:
p <- ggplotmpg, aesclass, hwy)) + geom_boxplot) p
我们为其赋以分组依据以配上颜色:
p <- ggplotmpg, aesclass, hwy, fill=factorclass))) p + geom_boxplot)
为我们的填充设置透明度,并将边框也赋以对应的颜色:
p <- ggplotmpg, aesclass, hwy, fill=factorclass), colour=factorclass)))+ geom_boxplotalpha=0.55) p
还可以将散点图与箱线图结合起来(这里施加jitter随机扰动以组织样本点重合):
p <- ggplotmpg, aesclass, hwy, fill=factorclass), colour=factorclass)))+ geom_boxplotalpha=0.55)+ geom_pointposition = 'jitter') p
2.7 histogram)
关于直方图,因为前面也说过,这里就举几个由朴素的直方图扩展开的示例:
libraryggplot2) p <- ggplotdiamonds, aescarat)) + geom_histogram) p
p <- ggplotdiamonds, aescarat,fill=cut)) +
geom_histogram)
p
p <- ggplotdiamonds, aescarat, fill=cut)) + geom_histogram)+ facet_gridfacets = .~cut) p
2.8 curve)与segment)
有时候我们需要在已绘制的图形中添加线段、曲线、小箭头之类的注解,这时候就可以用到ggplot2中的geom_curve)与geom_segment),他们的主要参数类似,需要在aes)中定义起点坐标x、y,以及终点坐标xend、yend,如需要线段或曲线上带有小箭头,则额外定义参数arrow即可,箭头方向由之前的起点终点决定:
data <- data.framex=c1,2,3,4),y=c1,2,3,4)) p <- ggplotdata,aesx,y))+ geom_point) p p + geom_curvedata=data,aesx=x[1],y=y[1],xend=x[4],yend=y[4],colour='曲线'))
在原有图形基础上添加线段并带上小箭头:
p + geom_curvedata=data,aesx=x[1],y=y[1],xend=x[4],yend=y[4],colour='曲线'))+ geom_segmentdata=data,aesx=x[2],y=y[2],xend=x[3],yend=y[3],colour='直线'), arrow = arrowlength = unit0.02, 'npc')))
2.9 text)与label)
有些时候我们需要在已绘制的图形上添加文本类标签,这种时候就需要用到text)和label)了,下面以不同的示例来说明其常见用法:
用对应每一个样本的文本标签代替散点:
p <- ggplotmtcars, aeswt, mpg, label = rownamesmtcars)))
p + geom_text)
对出现标签遮挡的情况进行抹除(不建议使用):
p + geom_textcheck_overlap = TRUE)
使用别致的标签:
p + geom_label)
改变文本标签的大小:
p + geom_textsize = 10)
调整文字标签位置:
p + geom_point) + geom_texthjust = 0, nudge_x = 0.05)
调整文字标签位置:
p + geom_point) + geom_textvjust = 0, nudge_y = 0.5)
调整文本标签位置:
p + geom_point) + geom_textangle = 45)
更精致的标签类型:
p + geom_labelaesfill = factorcyl)), colour = "white", fontface = "bold")
在图床指定位置添加文本标签:
df <- data.frame x = c1, 1, 2, 2, 1.5), y = c1, 2, 1, 2, 1.5), text = c"bottom-left", "bottom-right", "top-left", "top-right", "center") ) ggplotdf, aesx, y)) + geom_textaeslabel = text))
可以看出,落入四角的标签因为其中心对应坐标点,导致部分内容伸出边界,这里我们令vjust = “inward”, hjust = “inward”使得它自适应的调整位置以显示全部信息:
ggplotdf, aesx, y)) + geom_textaeslabel = text), vjust = "inward", hjust = "inward")
2.10 violin)
小提琴图是一种功能和箱线图类似,但增加了核密度估计功能的图形,且更为美观,ggplot2可以绘制出与seaborn中的小提琴图同样优美的图形,因为涉及的内容比较复杂,我准备在之后单独开一篇来介绍,下面仅展示一张简单的小提琴图:
libraryggplot2) data <- mtcars p <- ggplotdata, aesfactorcyl), mpg))+ geom_violinaesfill = cyl,colour=cyl)) p
以上就是ggplot2中常规图形的简单介绍,其中比较重要且比较复杂的几种将会在之后单独开文章详细介绍,如有笔误,望指出。



































