ggplot学习文档

安装 ggplot

  1. install.packages('ggplot2')
  1. library(ggplot2)

快速作图

  1. set.seed(1410) #让样本可重复
  2. dsmall = diamonds[sample(nrow(diamonds),100),] #使用一个小型数据集

R-003 ggplot2使用qplot()函数 - 图1

体积和重量的关系-线性关系

  1. # log(carat)对log(price)的图形
  2. qplot(log(carat),log(price),data=diamonds)
  3. # 如果我们对钻石的体积和重量感兴趣
  4. qplot(carat,x*y*z,data=diamonds)

R-003 ggplot2使用qplot()函数 - 图2

在重量和价格的散点图添加颜色

  1. qplot(carat,price,data=dsmall,colour=color)

R-003 ggplot2使用qplot()函数 - 图3

在重量和价格的散点图添加切工信息

  1. qplot(carat,price,data=dsmall,shape=cut) #形状切工

R-003 ggplot2使用qplot()函数 - 图4

创建半透明的颜色使用alpha图形属性,其值从0(完全透明)到1(完全不透明)

  1. qplot(carat,price,data=diamonds,alpha=I(1/10))
  2. qplot(carat,price,data=diamonds,alpha=I(1/100))

R-003 ggplot2使用qplot()函数 - 图5

向图形中添加平滑曲线

二维的变量关系

  1. # geom = "point"可以绘制散点图,这是当指定了x和y 参数给qplot的默认设置
  2. # geom = "smooth"将拟合一条平滑曲线,并将曲线和标准误差展现在图中。
  3. # geom = "boxplot"可以绘制箱线图
  4. # geom = "path"和geom="line"可以在数据点之间绘制连线,这类图传统的作用是探索时间和其他变量之间的关系。

一维的变量关系

  1. # 对于连续变量,geom = "histogram"绘制直方图,geom="freqploy"绘制频率多边形,geom="density"绘制密度曲线。
  2. # 对于离散变量,geom="bar"用来绘制条形图。

R-003 ggplot2使用qplot()函数 - 图6

平滑曲线和点

R-003 ggplot2使用qplot()函数 - 图7

【注】:灰色区域表示逐点的置信区间。

利用method参数可以选择许多不同的平滑器

method = “loess”,当n较小时是默认选项,使用的是局部回归的方法。曲线的平滑程度是由span参数控制的,范围从0(很不平滑)到1(很平滑)。

  1. qplot(carat,price,data=dsmall,geom=c("point","smooth"),span=0.2)

R-003 ggplot2使用qplot()函数 - 图8

  1. qplot(carat,price,data=dsmall,geom=c("point","smooth"),span=1)

R-003 ggplot2使用qplot()函数 - 图9

箱线图和扰动点图

如果数据集中包含了一个分类变量和一个或多个连续变量,连续变量会如何随着分类变量水平的变化而变化呢?箱线图和扰动点图提供了各自的方法达到这个目的。

  1. qplot(color,price/carat,data=diamonds,geom="jitter",alpha=I(1/5))
  2. qplot(color,price/carat,data=diamonds,geom="jitter",alpha=I(1/50))

R-003 ggplot2使用qplot()函数 - 图10
R-003 ggplot2使用qplot()函数 - 图11

上面扰动点图的重叠问题可以用半透明颜色来解决。

  1. qplot(color,price/carat,data=diamonds,geom="boxplot")

R-003 ggplot2使用qplot()函数 - 图12
【注】:箱线图显示了分布的中位数和四分位数都没有太大的变化。

直方图和密度曲线图

直方图和密度曲线图可以展示单个变量的分布,相对于箱线图而言,它们提供了更多关于单个分布的信息,但不利于在不同组之间比较。
下图展示了钻石重量的直方图和密度曲线图:

  1. qplot(color,price/carat,data=diamonds,geom="jitter",alpha=I(1/5))
  2. qplot(color,price/carat,data=diamonds,geom="jitter",alpha=I(1/50))

R-003 ggplot2使用qplot()函数 - 图13
R-003 ggplot2使用qplot()函数 - 图14

adjust控制密度曲线的平滑程度(取值越大越平滑),binwidth参数控制直方图的组距,组距较小显示更多细节,组距较大反应总体特征。

  1. qplot(carat,data=diamonds,geom="histogram",binwidth=1,xlim=c(0,3))
  2. qplot(carat,data=diamonds,geom="histogram",binwidth=0.1,xlim=c(0,3))

R-003 ggplot2使用qplot()函数 - 图15
R-003 ggplot2使用qplot()函数 - 图16

要在不同组之间进行对比,只需要在加上一个图形映射:

  1. qplot(carat,data=diamonds,geom="density",colour=color)
  2. qplot(carat,data=diamonds,geom="histogram",fill=color)

R-003 ggplot2使用qplot()函数 - 图17
R-003 ggplot2使用qplot()函数 - 图18

条形图

在离散变量的情形下,条形图和直方图类似,绘制方法是geom=”bar”

  1. qplot(color,data=diamonds,geom="bar")

R-003 ggplot2使用qplot()函数 - 图19

时间序列中的线条图和路径图

线条图是将点从左到右进行连接,而路径图则按照点在数据集中的顺序对其进行连接。
由于diamonds中没有包含时间变量,我们这里使用economics数据集,它包含美国过去40年的经济数据。
下图展示了失业率随时间变化的线条图:
R-003 ggplot2使用qplot()函数 - 图20

我们将年份映射到属性colour上,更容易看清时间的行进方向。

  1. year <- function(x) as.POSIXlt(x)$year +1900
  2. plot(unemploy/pop,uempmed,data=economics,geom="path",colour=year(date))

分面

分面将数据分割成若干子集,然后创建一个图形矩阵,将每一个子集绘制到图形矩阵的窗格中。
qplot()中默认分面方法是将图形拆分成若干窗格,可以通过形如raw_var~col_var来指定。
..density..是一个新的语法,告诉ggplot2将密度而不是频数映射到y轴。

  1. qplot(carat,..density..,data=diamonds,facets=color~.,geom="histogram",binwidth=0.1,xlim=c(0,3))

R-003 ggplot2使用qplot()函数 - 图21

其他选项

  1. # qplot()中还有一些其他选项用于控制图形外观。
  2. # xlim,ylim:设置x轴和y轴的显示区间,例如xlim=c(0,20)
  3. # log:对变量的对数操作
  4. # main:图形的主标题,以大字号显示
  5. # xlab,ylab:设置x轴和y轴的标签文字
  1. qplot(carat,price,data=dsmall,xlab="Price ($)",ylab="Weight (carats)",main = "Price-wight relationship")

R-003 ggplot2使用qplot()函数 - 图22

  1. qplot(carat,price,data=dsmall,xlab=expression(frac(price,carat)),ylab="Weight (carats)",main = "small demonds",xlim=c(2,1))

R-003 ggplot2使用qplot()函数 - 图23

参考书籍:ggplot:数据分析和图形艺术
参考学习文档-ggplot2之快速作图qplot()