Haste makes waste

Uda-DataAnalysis-22-[扩展]-R语言实战(第二版)-19-使用ggplot2进行高级绘图

Posted on By lijun

1. 四种图形系统

如下是R中经常使用的四种图形系统:

image

后续将用三个数据集解释ggplot2的使用:

  • 第一个是从lattice包中的singer数据集,它包括纽约合唱团歌手的高度和语音变量。
  • 第二个是在本书中已经使用过的mtcars数据集,它包含32辆汽车的详细信息。
  • 最后一个是在第8章中讨论的car包中的Salaries数据集。Salaries数据集包含大学教授的收入信息,并用来探索性别差异对他们收入的影响。

2. ggplot2 包介绍

在ggplot2中,图是采用串联起来(+)号函数创建的。每个函数修改属于自己的部分。下面给出了一个最简单的例子:

  • 示例1:简单示例
  1. ggplot初始化图形并指定要用到的数据来源data,和变量aes(aes:aesthetics 视觉呈现信息)
  2. aes()函数指定每个变量扮演的角色
  3. geom_point()表示创建一个散点图
  4. labs()函数是可选函数,可添加注释(包括轴标签和标题)
ggplot(data=mtcars,aes(x=wt,y=mpg)) + 
  geom_point() +
  labs(title="Automobile Data",x="Weight",y="Miles Per Gallon")

image

  • 示例2
    1. geom_point函数中,pch=17表示三角形,size=2点的大小加倍
    2. geom_smooth()函数增加了一条平滑的曲线,这里需要线性拟合(method=”lm”),红色的虚线
ggplot(data=mtcars,aes(x=wt,y=mpg)) + 
  geom_point(pch=17,color="blue",size=2) +
  geom_smooth(method="lm",color="red",linetype=2) + 
  labs(title="Automobile Data",x="Weight",y="Miles Per Gallon")

image

  • 示例3:分组和小面化(faceting)

分组指在一个图形中显示两组或多组结果,小面化是再单独并排的图形上显示观察组。 ggplot2包在定义组或面时使用因子。

先需要将am(手动,自动),vs(V型发动机与直列式发动机),cyl(发动机气缸数量)转化为因子

mtcars$am <- factor(mtcars$am,levels = c(0,1),
                    labels = c("Automatic","Manual"))

mtcars$vs <- factor(mtcars$vs,levels = c(0,1),
                    labels = c("V-Engine","Straght Engine"))

mtcars$cyl <- factor(mtcars$cyl)
ggplot(data=mtcars,aes(x=hp,y=mpg,shape=cyl,color=cyl)) +
  geom_point(size=3) +
  facet_grid(am~vs) +
  labs(title="Automobile Data by Engine Type",x="Horsepower",y="Miles Per Gallon")
  

image

参考上面图,包含了变速箱类型,发动机类型每个组合的分离的离散点,每个点的颜色形状表示发动机气缸的数量。 在本例中,am和vs是刻面变量,cyl是分组变量。

3. 用几何函数指定图的类型

ggplot()函数指定要绘制的数据源和变量,几何函数则指定这些变量如何在视觉上进行表示(使用点/条/线/阴影区),下面是常见的几何函数。

image

如下是几何函数的常见选项:

image

image

  • 示例1:
data(singer,package = "lattice")

ggplot(data=singer,aes(x=height)) + geom_histogram()

image

  • 示例2:
ggplot(data=singer,aes(x=voice.part,y=height)) + geom_boxplot()

image

上图可以看到,低音歌唱家的身高,比高音的更高。

创建直方图只用指定变量x,y默认为count,但创建箱线图变量时,变量x和y都需要指定。

  • 示例3,不同学术地位对应薪水的缺口箱线图。
  1. 实际的观测值(教师)是重叠的,因而给了一定的透明度0.5.
  2. 使用了抖动jitter以减少重叠。
  3. 最后一个地毯图在左侧显示薪水的一般扩散。
#install.packages("car") 
data(Salaries,package = "car")
ggplot(data=Salaries,aes(x=rank,y=salary)) +
        geom_boxplot(fill="cornflowerblue",
        color="black",notch=TRUE) +
        geom_point(position = "jitter",color="blue",alpha=.5) +
        geom_rug(side="1",color="black")

image

从上图可以看出,助理教授/副教授/教授的工资显著不同。

4. 分组

5. 刻面

6. 添加光滑曲线

7. 修改ggplot2图形的外观

8. 保存图形