Yuanzhen Lin
菜单
置顶

ggplot2高级绘图(一)

作者:林元震

主要内容

  • 简介
  • 基础语法
  • 常见图形绘制
  • 高级参数设置

参考资料

  • 林元震主编.《R与ASReml-R统计学》.2016
  • 林元震,陈晓阳主编.《R与ASReml-R统计分析教程》.2014
  • 统计之都 译.ggplot2:数据分析与图形艺术.2013
  • Winston Chang著.《R数据可视化手册》.2014

1 简介

2 基础语法

  • 数据data和映射Mapping
  • 标度Scale
  • 几何对象Geom
  • 统计变换Stat
  • 坐标系统Coord
  • 图层Layer
  • 分面Facet

    下文将采用本人主编教材《R与ASReml-R统计学》中的数据集dfm,演示ggpot2如何绘制部分常见图形。数据集程序包RSTAT2D可以在网站(http://yzhlin-asreml.ys168.com/)免费下载免费下载)。

2.1 数据data和映射Mapping

通过ggplot创建图形对象,通过summary()查看图形内容。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    data(dfm,package='RSTAT2D') 
    p <- ggplot(dfm, aes(x=h5, y=h3))
    
summary(p)
## data: TreeID, Spacing, Rep, Fam, Plot, dj, dm, wd, h1, h2, h3, h4,
##   h5 [827x13]
## mapping:  x = ~h5, y = ~h3
## faceting: <ggproto object: Class FacetNull, Facet, gg>
##     compute_layout: function
##     draw_back: function
##     draw_front: function
##     draw_labels: function
##     draw_panels: function
##     finish_data: function
##     init_scales: function
##     map_data: function
##     params: list
##     setup_data: function
##     setup_params: function
##     shrink: TRUE
##     train_scales: function
##     vars: function
##     super:  <ggproto object: Class FacetNull, Facet, gg>

summary(p)结果显示,数据data:一个含有13个变量的数据集[827x13],映射Mpaping:将变量h5映射给x,将变量h3映射给y。

2.2 图层Layer

添加“点”几何对象

1
    p1 <- p + geom_point();grid.arrange(p,p1, ncol=2)

左图为p,是空的,即有数据和变量映射,没有任何几何对象。右图为添加散点的几何图形。

3 绘制常见图

  • 密度曲线density plot
  • 直方图histogram
  • 散点图 scatt point
  • 二维密度图

3.1 密度曲线density plot

ggplot2中密度图的基础绘图方法如下:
ggplot(data, aes(x=))+geom_density()+facet_grid()
其中data代表数据集,aes代表数据映射,x代表连续型变量,geom_density代表几何对象为密度函数,facet_grid代表分面。

1
2
3
4
5
6
7
    pbs<-ggplot(dfm,aes(x=h3))+theme.1

    # 使用geom_density()
    p1<-pbs+geom_density()

    # 使用geom_line()
    p2<-pbs+geom_line(stat="density")

注:theme.1是绘图主要设置,请见本文的最后部分。

###添加填充颜色fill,透明度alpha。

1
    (pbs+geom_density(fill="blue",alpha=.2))

注:()的作用是让生成的图形直接输出。

为颜色参数colour和fill分别指定映射变量Spacing。

1
2
    p3<-pbs+geom_density()+aes(colour=Spacing)+labs(tag='p3')
    p4<-pbs+geom_density(alpha=.2)+aes(fill=Spacing)+labs(tag='p4')

可以看出,colour和fill都是颜色参数,但前者指定边界颜色,后者指定区域填充颜色。

添加分面

1
    (pbs+geom_density()+facet_grid(. ~ Spacing) )

3.2 直方图 histogram

ggplot2中直方图的基础绘图方法如下:
ggplot(data, aes(x=))+geom_histogram()+facet_grid()
其中data代表数据集,aes代表数据映射,x代表连续型变量,geom_histogram代表直方图,facet_grid代表分面。

1
    (pbs+geom_histogram())

添加图形参数binwidth,fill和colour。

1
    (phis=pbs+geom_histogram(binwidth =5,fill="white",colour="black"))

binwidth控制组间距,fill和colour作用同上。

添加分面

1
    (phis+facet_grid(Spacing ~ .,scales="free"))

参数scales作用是让坐标轴标度根据图形自行调整合适空间。

添加变量映射fill,按Spacing给定不同填空颜色。

1
    (pbs+aes(fill=Spacing)+geom_histogram(position="identity",alpha=.4))

position=“identity”,保留数据的原始位置,不做任何调整。

将直方图和密度图合在一起

1
2
3
    (phis+aes(y=..density..) +
       geom_density(lwd=1,colour='blue',linetype='dashed')+
       ylab('density'))

3.3 散点图scatter plot

ggplot2中散点图的基础绘图方法如下:
ggplot(data, aes(x=, y=))+geom_point()+facet_grid()
其中data代表数据集,aes代表数据映射,x代表连续型变量,y代表连续型变量,geom_point代表散点图,facet_grid代表分面。

1
    (ppoi=pbs+aes(y=h5)+geom_point(size=2))

通过图形参数指定点的大小size。

添加映射变量size和colour

1
    (ppoi+geom_point(aes(size=h5,colour=Spacing)))

size根据h5值调整数据点大小,colour控制点的颜色按照Spacing显示。注意与上一图的区别。

添加映射变量fill和shape

1
    (ppoi1=ppoi+aes(fill=Spacing,colour=Spacing, shape=Spacing))

将h5数据分割成两部分

1
2
3
4
5
6
    dfm$h5G=cut(dfm$h5,breaks=c(-Inf,600,Inf),
                labels=c("< 600" , ">= 600" ) )

    ppoi1 %+% dfm + aes(fill=h5G) + scale_shape_manual(values=c(21, 24)) +
      scale_fill_manual(values=c('blue', "red" ),
                        guide=guide_legend(override.aes=list(shape=21)))

注意:数据集dfm已经发生变化,多了h5G变量,因此需要用%+%来添加新的数据集dfm。

添加分面与回归线和置性区

1
    ppoi+facet_grid(Spacing ~ .) + stat_smooth(method=lm,fill='red')

3.4 二维密度图

ggplot2中二维密度图的绘图方法如下:
ggplot(data, aes(x=,y=))+ geom_density2d()+facet_grid()
其中data代表数据集,aes代表数据映射,x、y代表连续型变量,geom_density2d代表几何对象为二维密度图,facet_grid代表分面。

1
    (pden2d=pbs+aes(y=wd)+geom_density2d()+facet_grid(. ~ Spacing))

图中仅有线条,未能更好地了解树高h3和木材密度wd之间的具体关系,这时可以加上填充颜色。

1
    (pden2d1=pden2d+stat_density2d(aes(fill=..level..),geom="polygon"))

虽然有了填充色,但色差不明显,也不便于两性状之间的关系,因此可以设定色差显著的填充色。

1
    pden2d1+scale_fill_continuous(high="darkred",low="darkgreen")

从图可知,在种植密度S2,密度wd主要分布在树高h3的(250-300)区间,而且变异幅度(0.35-0.4)比较大,而在种植密度S3,密度wd基本集中在中心,而且变异幅度(0.36-0.38)较小。

绘图主题设置

1
2
3
4
5
6
7
8
9
    # theme setting
    theme.1<-theme(
      axis.title=element_text(face="bold",colour="red",size=20),
      axis.text=element_text(face="bold",colour="black",size=10),
      axis.line=element_line(colour="black",size=1.5),
      panel.grid.major=element_line(colour="white"),
      panel.grid.minor=element_line(colour="white",size=.5), #linetype="dashed",
      panel.background=element_rect(fill="grey",colour="blue",size=1.5)    
    )

下一讲,将介绍绘图参数的设置。
* 坐标轴
* 添加注释
* 图形图例
* 图形配色
* 图形输出