ggplot2 的图层化架构鼓励我们以一种结构化的方式来设计和构建图形.

图层叠加的总体策略

在添加图层之前弄清楚他的作用是十分必要的:

  • 用以展示数据本身
  • 用以展示数据的统计摘要
  • 用以添加额外的元数据, 上下文信息和注解

基本图形类型

  • geom_area() 用于绘制面积图(area plot)
  • geom_bar(stat = “identity”) 绘制条形图
  • geom_line() 绘制线条图
  • geom_point() 绘制散点图
  • geom_polygon() 绘制多边形
  • geom_text() 在指定点处添加标签
  • geom_tile() 用来绘制色深图(image plot) 或水平图(level plot)

展示数据分布

联合分布: 我们可以改变组距宽度(binwidth) 或者显式地精确制定切分位置(breaks)来绘制表现力强的图.

以下是具体事例:

1
2
3
4
5
> library(ggplot2)
> depth_dist <- ggplot(diamonds,aes(depth)) +xlim(58,68)
> depth_dist + geom_histogram(aes(y=..density..), binwidth = 0.1) + facet_grid(cut ~ .)
> depth_dist + geom_histogram(aes(fill = cut), binwidth = 0.1, position = "fill")
> depth_dist + geom_freqpoly(aes(y=..density.., colour = cut), binwidth = 0.1)

Rplot

和分布相关的许多几何对象都是以几何对象(geom)/统计变换(stat)的形式成对出现的:

geom_boxplot = stat_boxplot + geom_boxplot: 箱线图, 即一个连续型变量针对一个类别型变量取条件所得的图形.

1
2
3
> library(plyr)
> qplot(cut, depth, data = diamonds,geom = "boxplot")
> qplot(carat,depth, data = diamonds, geom = "boxplot", group = round_any(carat,0.1,floor), xlim = c(0,3))

Rplot2

geom_jitter = position_jitter + geom_point: 通过在离散型分布上添加随机噪声以避免遮盖绘制问题.

1
2
> qplot(class,cty,data = mpg,geom = "jitter")
> qplot(class,drv,data = mpg,geom = "jitter")

Rplot3

geom_density = stat_density + geom_area 基于核平滑方法进行平滑后得到的频率多边形.

1
2
> qplot(depth,data = diamonds,geom = "density",xlim = c(54,70))
> qplot(depth,data = diamonds,geom = "density", xlim = c(54,70), fill = cut,alpha = I(0.2))

Rplot4

处理遮盖绘制问题

小规模遮盖绘制问题(overploting)可以通过绘制更小的点加以缓解, 或者使用中空的符号

1
2
3
4
5
> df <- data.frame(x = rnorm(2000), y = rnorm(2000))
> norm <- ggplot(df,aes(x,y))
> norm + geom_point()
> norm + geom_point(shape = 1) #中空的点
> norm + geom_point(shape = ".") #点的大小为像素级

Rplot5

对于更大的数据集产生的更为严重的遮盖绘制问题, 我们可以使用 α 混合(调整透明度) 让点呈现透明的效果

1
2
3
> norm + geom_point(colour = "black", alpha = 1/3)
> norm + geom_point(colour = "black", alpha = 1/5)
> norm + geom_point(colour = "black", alpha = 1/10)

Rplot6

如果数据存在一定的离散性, 我们可以通过在点上增加随机扰动来减轻重叠, 默认情况下, 增加的扰动量是数据分辨率(resolution)

1
2
3
4
5
6
7
8
> td <- ggplot(diamonds, aes(table,depth)) + xlim(50,70) + ylim(50,70)
> td + geom_point()
> td + geom_jitter()
> jit <- position_jitter(width = 0.5)
> td + geom_jitter(position = jit)
> td + geom_jitter(position = jit, colour = "black", alpha = 1/10)
> td + geom_jitter(position = jit, colour = "black", alpha = 1/50)
> td + geom_jitter(position = jit, colour = "black", alpha = 1/200)

Rplot7

将点分箱并统计每个箱中点的数量, 然后通过某种方式可视化这种数量(直方图的二维推广)

1
2
3
4
5
6
7
> d <- ggplot(diamonds,aes(carat,price)) +xlim(1,3) + theme(legend.position = "none")
> d + stat_bin2d()
> d + stat_bin2d(bins = 10)
> d + stat_bin2d(binwidth = c(0.02,200))
> d + stat_binhex()
> d + stat_binhex(bins = 10)
> d + stat_binhex(binwidth = c(0.02,200))

Rplot8

使用 stat_density2d 作二维密度估计, 并将等高线添加到散点图中, 或以着色瓦片(colored tiles)直接展示密度, 或使用大小与分布密度成比例的点进行展示

1
2
3
4
5
> d <- ggplot(diamonds, aes(carat, price)) + xlim(1,3) + theme(legend.position = "none")
> d + geom_point() + geom_density2d()
> d + stat_density2d(geom = "point", aes(size=..density..), contour = F) + scale_size_area()
> d + stat_density2d(geom = "tile", aes(fill = ..density..), contour = F)
> last_plot() + scale_fill_gradient(limits = c(1e-5,8e-4))

Rplot9

曲面图

ggplot2 暂不支持真正的三维曲面图, 对于三维交互式图形的绘制, 参考 RGL.

绘制地图

1
2
3
4
5
6
7
8
> library(maps)
> data(us.cities)
> big_cities <- subset(us.cities, pop > 500000)
> qplot(long, lat, data = big_cities) + borders("state", size = 0.5)
> tx_cities <- subset(us.cities, country.etc == "TX")
> ggplot(tx_cities, aes(long,lat)) + borders("country", "texas", colour = "grey70") + geom_point(colour = "black", alpha = 0.5)
Error in get(dbname) : object 'countryMapEnv' not found
> ggplot(tx_cities, aes(long,lat)) + borders("country", "texas", colour = "grey70") + geom_point(colour = "black", alpha = 0.5)

Rplot10

揭示不确定性

变量 X 类型 仅展示区间 同时展示区间和中间值
连续型 geom_ribbon geom_smooth(stat = “identity”)
离散型 geom_errorbar geom_crossbar
离散型 geom_errorbar geom_crossbar

统计摘要

在 ggplot2 中, 我们使用 stat_summary() 来显示统计摘要, 它使用 ymin, y 和 ymax 等图形属性, 为汇总 y 的条件分布提供了一直灵活的方式.

单独的摘要计算函数

参数 fun.y, fun.ymin 和 fun.ymax 能够接受简单的数据型摘要计算函数, 该函数能够传入一个数值向量并返回一个数值型结果.

统一的摘要计算函数

fun.data 可以支持更复杂的摘要计算函数.

添加图形注解

  • geom_text 可添加文字叙述或为点添加标签
  • geom_Vline, geom_hline 向图形添加垂直线或水平线
  • geom_abline 向图形添加任意斜率和截距的直线
  • geom_rect 可强调图形中刚兴趣的矩形区域
  • geom_line, geom_path 和 geom_segment 都可以添加直线

含权数据

我们可以通过修改 weight 属性来表现权重. 在权重有意义的情况下, 各种元素基本都支持权重的设定.

一首歌的结尾