ggplot2:再入门

ggplot2:再入门

这本书实际上自己之前已经看完了前五章,对ggplot的基本使用已经有所了解,不过时间已久,快不会用了,所以打算再重新入门一次。这本书中英文的电子版在我的书架上都有,欢迎下载学习。

基本用法

1
2
library(ggplot2)
qplot(x = carat, y = price, data = diamonds)

也可以在x、y参数中使用函数,例如对数化:

1
qplot(x = log(carat), y = log(price), data = diamonds)

如果我们对钻石的体积和中重量之间的关系感兴趣,可以这么做:

1
qplot(x = carat, y = x * y * z, data = diamonds)

颜色、大小、形状和其它图形属性

1
2
3
set.seed(1410)
dsmall <- diamonds[sample(nrow(diamonds), 100),]
qplot(x = carat, y = price, data = dsmall, colour = color)

1
qplot(x = carat, y = price, data = dsmall, shape = cut)

还可以利用I()来手动设定图形属性,例如colour = I(“red”)或size = I(2)。这个将会在后面介绍。对于大数据来说,使用半透明的颜色可以有效减轻图形元素重叠的现象。要创建半透明的颜色,可以使用alpha图形属性,其取值从0(完全透明)变动到1(完全不透明),通常透明度可以用分数来进行表示,例如1/10或1/20,其分母表示经过多少次重叠之后颜色将变得完全不透明。

1
qplot(x = carat, y = price, data = diamonds, alpha = I(1/100), colour = I("red"))

几何对象

qplot()并非只能绘制散点图,通过改变几何对象(geom),它几乎可以画出任何一种类型的图形。几何对象描述来应该用何种对象对数据进行展示,其中有些几何对象关联了相应的统计变换。例如,直方图就相当于分组计数再加上条形的几何对象。这里先介绍几种最为常见的:

  • point:散点图,默认设置;
  • smooth:平滑曲线和标准误;
  • boxplot:箱线图;
  • path和line:可以在数据点之间绘制连线。这类图传统的作用是探索时间和其它变量之间的关系, 但是连线同样可以用其他的方式将数据点连接起来,线条图只能创建从左到右的连线,而路径图可以是任意方向的。

对于一维的分布, 几何对象的选择由变量的类型决定的。

  • histogram:绘制直方图
  • freqplot:绘制频率多边形;
  • density:绘制密度曲线;

如果只有x参数传递给qplot(),那么直方图几何对象就是默认的选择。

  • bar:绘制条形图(离散变量)。

向图中添加平滑曲线

1
qplot(x = carat, y = price, data = dsmall, geom = c("point", "smooth"))

1
qplot(x = carat, y = price, data = diamonds, geom = c("point", "smooth"), xlab = "克拉", ylab = "价格")

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

  • loess:但n较小时的默认选项,使用的时局部回归的方法。曲线平滑的程度可以由span参数控制,其取值范围是0(很不平滑)~1(很平滑);
1
qplot(carat, price, data = dsmall, geom = c("point", "smooth"), span = 0.2)

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

Loess对于大数据并不十分适用,因此当n大于1000时将采用另一种平滑算法。

  • 可以使用method = “gam”, formula = y ~ s(x)来调用mgcv包拟合一个广义可加模型。这与在lm中使用样条相似,但样条的阶数是通过数据估计得到的。对于大数据,请使用公式y ~ s(x, bs = “cs”),这是数据量超过1000时默认使用的选项。
1
2
library(mgcv)
qplot(carat, price, data = dsmall, geom = c("point", "smooth"), method = "gam", formula = y~s(x))


1
qplot(carat, price, data = diamonds, geom = c("point", "smooth"), method = "gam", formula = y~s(x, bs = "cs"))

  • lm:拟合的是线性模型,默认情况是拟合一条直线,但是可以通过指定formula = y ~ poly(x, 2)来拟合一个二次多项式或加载splines包以使用自然样条:formula = y ~ ns(x, 2)。第二个参数是自由度:自由度取值越大,曲线的波动越大。
1
2
library(splines)
qplot(carat, price, data = dsmall, geom = c("point", "smooth"), method = "lm")

1
qplot(carat, price, data = dsmall, geom = c("point", "smooth"), method = "lm", formula = y ~ ns(x, 5))

  • rlm:与lm类似,但是采用了一种更稳健的拟合算法,使得结果对异常值不太敏感,这一方法是MASS包的一部分。所以需要预先加载MASS包。
1
2
library(MASS)
qplot(carat, price, data = dsmall, geom = c("point", "smooth"), method = "rlm")

箱线图和扰动点图

如果一个数据集中包含了一个分类变量和一个或多个连续变量,那么你可能想知道连续变量会如何随着分类变量水平的变化而变化。箱线图和扰动点图提供了各自的方法来达到这个目的,扰动点图使用参数geom = “jitter”,箱线图使用参数geom = “boxplot”:

1
qplot(color, price/carat, data = diamonds, geom = "jitter", xlab = "颜色", ylab = "每克拉钻石的价格")

1
qplot(color, price/carat, data = diamonds, geom = "boxplot", xlab = "颜色", ylab = "每克拉钻石的价格")

可以使用alpha参数搭配jitter对象观察散点遮盖问题。

1
qplot(color, price/carat, data = diamonds, geom = "jitter", xlab = "颜色", ylab = "每克拉钻石的价格", alpha = I(1/20))

直方图和密度曲线图

1
qplot(carat, data = diamonds, geom = "histogram")

1
qplot(carat, data = diamonds, geom = "density")

对于密度曲线,adjust参数控制了曲线的平滑程度(adjust参数取值越大,曲线越平滑)。
对于直方图,binwidth参数通过设定组距来调节平滑度。切分位置同样可以通过breaks参数进行显式指定。

1
qplot(carat, data = diamonds, geom = "histogram", binwidth = 0.01)


1
qplot(carat, data = diamonds, geom = "density", adjust = 2)


1
qplot(carat, data = diamonds, geom = "density", colour = color)


1
qplot(carat, data = diamonds, geom = "histogram", fill = color)

条形图

1
qplot(carat, data= diamonds, geom = "bar")

按carat加权:

1
qplot(carat, data = diamonds, geom = "bar", weight = carat, binwidth = 0.1) + scale_y_continuous("carat")

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

1
qplot(date, unemploy/pop, data = economics, geom = "line", xlab = "日期", ylab = "失业人口比例")


1
qplot(date, uempmed, data = economics, geom = "line", xlab = "日期", ylab = "失业星期数的中位数")

失业率和失业时间长度随时间变化的路径:

1
qplot(unemploy/pop, uempmed, data = economics, geom = c("point", "path"))

由于上图中的线条有很多交叉,所以时间变化方向很不明显,可以将年份映射到colour属性上,这样可以更加容易的观察时间的行进方向。

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

分面

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


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

其它选项

  • xlim/ylim:设置轴的显示区间,取值为二维数值向量;
  • log:一个字符型向量,说明是哪个轴取对数,取值:x/y/xy;
  • main:图形的主标题;
  • xlab/ylab:轴标题。
    1
    2
    3
    4
    5
    6
    7
    8
    qplot(
    carat, price, data = dsmall,
    xlab = "价格(美元)", ylab = "重量(克拉)",
    main = "钻石重量与价格的关系",
    log = "xy",
    xlim = c(0.5, 2.0), ylim = c(5000, 15000),
    asp = 0.5 # y/x比率
    )

qplot与plot函数的区别

  • qplot不是泛型函数,注意,ggplot()是一个泛型函数;
  • 一般而言,你可以将一个变量传递给你感兴趣的图形属性,这样该变量将进行标度转换并显示在图例上。如果你想对其进行赋值,比如让点的颜色变为红色,这可以使用I()函数:color = I(“red”)。这部分内容会在后面介绍。
  • ggplot2中的图形属性名称(如colour,shape和size)比基础绘图系统中的名称(如col,pch和cex等)更直观,且更容易记忆;
  • 在基础绘图系统中,你可以通过points(), lines()和text()函数向已有的图形中添加更多的元素。而在ggplot2中,你需要在当前图形中假如额外的图层。

qplot帮助文档中的示例

使用数据框

1
qplot(mpg, wt, data = mtcars, colour = cyl)


1
qplot(mpg, wt, data = mtcars, size = cyl)

vs和am是两个零一变量:

1
qplot(mpg, wt, data = mtcars, facets = vs ~ am)

使用其它对象

1
qplot(1:10, rnorm(10), colour = runif(10))


1
qplot(1:10, letters[1:10])


1
2
mod <- lm(mpg ~ wt, data = mtcars)
qplot(resid(mod), fitted(mod))


1
2
3
4
5
6
f <- function() {
a <- 1:10
b <- a ^ 2
qplot(a, b)
}
f()

使用I()设置颜色

1
qplot(mpg, wt, data = mtcars, colour = I("red"))

qplot根据你的输入对象自动选择对应的图形对象

如果x和y都输入了,绘制散点图

1
qplot(mpg, wt, data = mtcars)

只输入了x,绘制直方图

1
qplot(mpg, data = mtcars)

只输入了y,绘制散点图

x = seq_along(y),seq_along(y)可以生成一个和y一样长的整数序列(从1开始)

1
qplot(y = mpg, data = mtcars)

使用不同的图形对象

1
qplot(mpg, wt, data = mtcars, geom = "path")


1
qplot(factor(cyl), wt, data = mtcars, geom = c("boxplot", "jitter"))


1
qplot(mpg, data = mtcars, geom = "dotplot")

# R

评论

程振兴

程振兴 @czxa.top
截止今天,我已经在本博客上写了659.4k个字了!

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×