六、R语言可视化--ggplot2定位之分面

xiaoxiao2021-02-28  28

分面也就是切割数据生成一系列小联号图,每个小图表示不同的数据子集。本篇将讨论如何较好的微调分面,特别是与位置标度相近的方法。

在qplot中可以选择分面系统。2维分面使用face_grid,1维分面使用face_wrap。

分面通常会占用大量空间,因此本篇使用mpg数据集的子集来进行展示。

1 2 >  library (ggplot2) > mpg2 <-  subset (mpg,cyl != 5 &drv % in %  c ( "4" , "f" ))

  1.网格分面

网格分面在2维网格中展示图形,输入分面表达式时,你需要设定哪些变量作为分面绘图的行,哪些变量作为列,规则如下:

不进行分面,我们将得到一个单独的面板 1 >  qplot (cty,hwy,data=mpg2) +  facet_null ()

  

一行多列 :". ~ a"

电脑屏幕通常较宽,因此这个方向最合适数据的展示。另外,因为坐标轴相同,这个方向也有助于y位置的比较。

1 qplot (cty,hwy,data=mpg2) +  facet_grid (. ~ cyl)

  

一列多行:"b ~ ."

横坐标轴相同,利于x位置的比较,尤其是对数据分布的比较。

1 >  qplot (cty,data=mpg2,geom= "histogram" ,binwidth=2) +  facet_grid (cyl ~ .)

  

多行多列:"a ~ b"

我们通常都将因子水平数目最大的变量按列排放,这样可以充分利用屏幕的宽高比。

1 >  qplot (cty,hwy,data=mpg2) +  facet_grid (drv ~ cyl)

  

从以上图形我们可以看出,变量在某行或者某列一起出现时,图形只会展示数据中出现的变量组合。而变量在行和列都出现时,图形将展示所有变量组合,包括原始数据中都没有出现的组合。不过这也可能会导致出现空白面板。

边际图:可以参考margins来绘制边际图。设定margins=TRUE可展示所有的边际图,或者margins=c("sex","age"),列出你要展示的边际图的变量名称。也可以使用grand_row或grand_col来生成行或列的边际图。

边际图的分组方式与其他面板中分组方式相同:默认使用图层中所有分类变量的交互作用。下面第三张图表示对每个驱动类型添加彩色平滑线。

1 2 3 > p <-  qplot (displ,hwy,data=mpg2) +  geom_smooth (method =  "lm" ,se=F) > p +  facet_grid (cyl ~ drv) > p +  facet_grid (cyl ~ drv,margins = T)

> qplot(displ,hwy,data=mpg2) + geom_smooth(aes(colour=drv),method="lm",se=F)++ facet_grid(cyl ~ drv,margins=T)

  

2.标度控制

对于上述分面,可以通过调整参数scales来控制面板的位置标度是固定的还是允许变化的。

scales = "fixed":x和y的标度在所有面板中都相同scales = "free":x和y的标度在每个面板都可以变化scales = "free_x":x的标度可变,y的尺度固定scales = "free_y": y的标度可变,x的尺度固定‘

下面展示了固定标度与自由标度间的差异:

1 2 3 4 5 >  library (ggplot2) > p <-  qplot (cty,hwy,data=mpg) > p +  facet_wrap (~ cyl)   ##下图左  每个分面中固定标度即横纵坐标范围相同 > p +  facet_wrap (~ cyl,scales= "free" )   ##下图右  自由标度即横纵坐标范围可变 >

  

固定标度可以让我们在相同的基准上对子集进行比较,观察在哪些地方各子集有相似的总体模式。而自由标度可以帮助我们发现更多细节,它在展示不同量纲的时间序列时非常有用。

1 2 3 4 5 >  library (reshape2) > em <-  melt (economics,id =  "date" ) >  qplot (date,value,data=em,geom= "line" ,group=variable)+ +  facet_grid (variable~.,scale= "free_y" ) >

  

上图展示了自由标度在展示不同量纲的时间序列时非常有用。

 3.分组与分面

与通过调整图形属性不同(比如颜色、形状或大小)来分组分组不同,分面提供了另外一种分组途径。依据子集相对位置的不同,这两种绘图技巧都有相应的优缺点。

在分面图形中,每个组别都在单独的面板中,相隔较远,组间无重叠。因此组与组之间重叠严重时,分面图形有一定的好处。不过这也会导致组间的细微差别难以被发现。使用图形属性区分各组时,各组将会离得很近甚至可能重叠,不过细微得差别将会容易被发现。下图展示了两者优缺点得互补。

1 2 3 4 5 6 7 8 9 10 11 >  library (ggplot2) > xmaj <-  c (0.3,0.5,1,3,5) > xmin <-  as.vector ( outer (1:10,10^ c (-1,0))) > ymai <-  c (500,1000,5000,10000) > ymin <-  as.vector ( outer (1:10,10^ c (2,3,4))) > dplot <-  ggplot ( subset (diamonds,color % in %  c ( "D" , "E" , "G" , "J" )), aes (carat,price,colour=color)) + +  scale_x_log10 (breaks = xmaj,labels = xmaj,minor = xmin)+ +  scale_y_log10 (breaks=ymai,labels=ymai,minor=ymin)+ +  scale_colour_hue (limits =  levels (diamonds$color))+ +  theme (legend.position= "none" ) > dplot +  geom_point ()

> dplot + geom_point()+facet_grid(.~color)> dplot + geom_smooth(method=lm,se=F,fullrange=T)> dplot + geom_smooth(method=lm,se=F,fullrange=T)+facet_grid(.~color)

  

     

在散点图中,仅使用颜色区分各组,我们可能还没注意到图形重叠了,但是回归线却可以让我们看到D、E、和G被分组在一起,与J组相距甚远。

4.并列与分面

分面可绘制出与图形并列类似得图形效果。

1 2 3 >   qplot (color,data=diamonds,geom= "bar" ,fill=cut,position= "dodge" )  ##并列 >  qplot (cut,data=diamonds,geom= "bar" ,fill=cut)+ facet_grid (.~color)+ +  theme (axis.text.x= element_text (angle=90,hjust=1,size=8,colour= "grey50" ))  ##分面

  

除标注方式外,当两个变量得因子水平几乎完全交叉,而部分变量组合缺失时,两种绘图方式也就会有所不同。此时,并列图形得用处不大,因为它只是对条形局部地分割,没有任何标签。而分面就实用很多,它能控制分割方式时局部得还是全局得。

 

转载请注明原文地址: https://www.6miu.com/read-2629766.html

最新回复(0)