简易目录:
1 从qplot开始:图形属性、几何对象、分面(facet)
2 用图层构建图像:图层、图形属性映射、几何对象、统计变换、位置调整、整合
3 工具箱:基本图形类型、展示数据分布、添加图形注解、含权数据
用数值标识的R的25种内置形状:
1 从qplot开始
qplot(x, y, data,…)
1.1 图形属性
颜色、大小和形状是图形属性的具体例子,是影响数据如何进行展示的视觉属性。
每一个图形属性都对应一个称为标度的函数,其作用是将数据的取值映射到该图形属性的有效取值。
可以利用I()
来手动设定图形属性。例如,colour=I(“red”)或size=I(2)。
不同类型的变量有不同适用的图形属性。例如,颜色和形状适合于分类变量, 而大小适合于连续变量。
1.2 几何对象
考察二维的变量关系:
散点图:geom ="point"
平滑曲线:geom = “smooth”
箱线胡须图:geom = “boxplot”
扰动点图:geom = “jitter”
连线:geom = “path”
、geom = “line”
,探索时间和其他变量之间的关系
一维的分布,根据变量的类型确定几何对象:
连续变量:直方图geom = “histogram”
、频率多边形geom = “freqpoly”
、密度曲线geom = “density”
离散变量:条形图geom = “bar”
添加平滑曲线
利用c()
函数将多个几何对象组合成一个向量传递给geom,几何对象会按照指定的顺序进行堆叠。
利用method参数选择不同的平滑器:method = “loess”
默认选项,使用局部回归的方法。method = ”gam”
, formula = y ~ s(x)调用mgcv包拟合一个广义可加模型。对于大数据,则用公式y ~ s(x, bs = “cs”)method = “lm”
拟合的是线性模型,可以指定formula = y ~ poly(x, 2)来拟合一个二次多项式或加载splines包以使用自然样条:formula = y ~ ns(x, 2),第二个参数是自由度,自由度取值越大,曲线的波动也越大。
1.3 分面(facet)
描述了如何将数据分解为各个子集,以及如何对于集作图并联合进行展示。分面也叫做条件作图或网格作图。
qplot() 中默认的分面方法是将图形拆分成若干个窗格,这可以通过形如row_var ~ col_var
的表达式进行指定。如果只想指定一行或一列,可以使用.
作为占位符,例如row_var ~ .
会创建一个单列多行的图形矩阵。..density..
告诉ggplot2将密度而不是频数映射到y轴。
2 用图层构建图像
qplot() 的局限性在于它只能使用一个数据集和一组图形属性映射。解决办法是使用图层,每个图层可以有自己的数据集和图形属性映射,附加的数据元素可以通过图层添加到图形中。
2.1 图层
一个图层由五个部分组成:
-数据(data):必须是一个数据框。
-映射(mapping):将数据中的变量对应到该图层的图形属性。
-几何对象(geom):代表在图中实际的图形元素,如点、线、多边形等。
-统计变换(stats):是对数据进行的某种汇总。例如,将数据分组计数以创建直方图,或将一个二维的关系用线性模型进行解释。
-位置调整:通过调整元素位置来避免图形重合。
ggplot(data, aes(x, y, …))
,aes() 放置变量名和图形属性,然后用 + 添加图层,如:1
2> p <- ggplot(diamonds, aes(carat, price, colour = cut)) #图形对象
> p <- p + geom_point() #图层函数
图层快捷函数:以geom_ 或者stat_ 开头:geom_XXX(mapping, data, …, stat, position)
stat_XXX(mapping, data, …, geom, position)
其中,mapping(可选):一组图形属性映射,通过aes() 设定
2.2 图形属性映射
图层映射和默认映射aes(mpg, wt)的结合:1
2
3> p <- ggplot(mtcars, aes(x = mpg, y = wt))
> p + geom_point(aes(colour = factor(cyl)))
> p + geom_point(aes(y = disp))
图层图形属性可以添加、修改和删除默认映射:
设定和映射
1 | > p + geom_point(colour = 'darkblue') |
第二个将colour 映射到”darkblue” 颜色,实际上是先创建了一个只含有”darkblue” 字符的变量,然后将colour 映射到这个新变量。因为这个新变量的值是离散型的,所以默认的颜色标度将用色轮上等间距的颜色,并且此处新变量只有一个值,因此这个颜色就是桃红色。
分组
自定义分组结构,即将group映射到一个在不同的组有不同取值的变量。当现有的单个变量不能够正确地分组,而两个变量的组合可以正确分组时可以使用interaction()函数。1
2
3> p <- ggplot(Oxboys, aes(age, height, group = Subject)) + geom_line()
> p
> p + geom_smooth(aes(group = 1), method = 'lm', size = 2, se = F)
根据所有男孩的年龄和身高在图中添加一条光滑线条,新图层需要一个不同的分组图形属性,group = 1,这样所绘出的线条才是基于整体数据的。
2.3 几何对象
ggplot2中的几何对象及其默认的统计变换和图形属性(黑体图形参数是必须声明的参数):
这里附上牛逼酷炫的ggplot2速查表
2.4 统计变换
统计变换,简称为stat,即对数据进行统计变换,它通常以某种方式对数据信息进行汇总。例如,平滑(smoother) 是一个很有用的统计变换,它能在些限制条件的约束下计算给定x 值时y 的平均值。下表为目前可用的统计变换:
统计变换生成变量的名字必须要用..围起来,可以防止原数据集中的变量和生成变量重名时造成混淆1
2
3
4> ggplot(diamonds, aes(carat)) +
+ geom_histogram(aes(y = ..density..), binwidth = 0.1)
#用qplot()生成该图形
> qplot(carat, ..density.., data = diamonds, geom = 'histogram', binwidth = 0.1'
2.5 位置调整
位置调整一般多见于处理离散型数据,连续型数据一般很少出现完全重叠的问题,下图为5种位置调整参数:1
2
3
4
5
6
7
8
9
10
11
12#position = "identity" 将每个对象直接显示在图中
> ggplot(data = diamonds, aes(x = cut, fill = cut)) +
+ geom_bar(position = 'identity') +
+ scale_fill_brewer(palette = 'Set2')
#position = "fill" 的效果与堆叠相似,但每组堆叠条形具有同样的高度,因此这种条形图可以非常轻松地比较各组间的比例
> ggplot(data = diamonds) +
+ geom_bar(aes(x = cut, fill = clarity), position = 'fill') +
+ scale_fill_brewer(palette = 'Set2')
#position = "dodge" 将每组中的条形依次并列放置,这样可以非常轻松地比较每个条形表示的具体数值
> ggplot(data = diamonds) +
+ geom_bar(aes(x = cut, fill = clarity), position = 'dodge') +
+ scale_fill_brewer(palette = 'Set2')
2.6 整合
直方图的两种变体:频率多边形、散点图,还有个热图画不出来1
2
3> d <- ggplot(diamonds, aes(carat)) + xlim(0, 3)
> d + stat_bin(aes(ymax = ..count..), binwidth = 0.1, geom = 'area')
> d + stat_bin(aes(size = ..density..), binwidth = 0.1, geom = 'point', position = 'identity')
通过修改其他几何对象默认值得到的几何对象:
3 工具箱
3.1 基本图形类型
geom_area()
用于绘制面积图(area plot).geom_bar(stat = "identity")
绘制条形图,因为默认的统计变换将自动对”值”进行计数,而统计变换identity将保持数据不变。geom_line()
绘制线条图。geom_path与geom_line 类似,但geom_path 中的线条是根据它们在数据中出现的顺序进行连接的,而非从左至右进行连接。geom_point()
绘制散点图。geom_polygon()
绘制多边形,即填充后的路径。geom_text()
可在指定点处添加标签。geom_tile()
用来绘制色深图(image plot)或水平图(level plot)。
3.2 展示数据分布
进行分布的跨组比较:同时绘制多个小的直方图facets = . ~ var
;使用条件密度图,position = "fill"
;或者使用频率多边形(frequency polygon),geom = "freqpoly"
。1
2
3
4
5> 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)
geom_boxplot = stat_boxplot + geom_boxplot
:箱线图,即一个连续型变量针对一个类别型变量取条件所得的图形。对连续型变量carat以0.1个单位为大小进行封箱得到图二的箱线图。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))
geom_denssity = stat_density + geom_area
:基于核平滑方法进行平前后得到的频率多边形,仅在已知潜在的密度分布为平滑、连续且无界的时候使用这种密度图。可以使用参数adjust 来调整所得密度曲线的平滑程度。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))
3.3 添加图形注解
geom_text
可添加文字叙述或为点添加标签。使用取子集的方式(subset()函数)抽取部分观测添加标签以标注出离群点或其他重要的点。geom_vline
, geom_hline
向图形添加垂直线或水平线。geom_abline
向图形添加任意斜率和截距的直线。geom_rect
可强调图形中感兴趣的短形区域,有xmin,xmax, ymin和ymax几种图形属性。geom_line
, geom_path
和geom_ segment
都可以添加直线。所有这些几何对象都有一个arrow参数,可以用来在线上放且一个箭头。也可以使用arrow() 函数绘制箭头。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25> head(economics)
# A tibble: 6 x 6
date pce pop psavert uempmed unemploy
<date> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1967-07-01 507. 198712 12.6 4.5 2944
2 1967-08-01 510. 198911 12.6 4.7 2945
3 1967-09-01 516. 199113 11.9 4.6 2958
4 1967-10-01 512. 199311 12.9 4.9 3143
5 1967-11-01 517. 199498 12.8 4.7 3066
6 1967-12-01 525. 199657 11.8 4.8 3018
> (unemp <- qplot(date, unemploy, data = economics, geom = 'line', xlab = '', ylab = 'No.unemployed (1000s'))
> presidential <- presidential[-(1:3), ]
> head(presidential)
# A tibble: 6 x 4
name start end party
<chr> <date> <date> <chr>
1 Nixon 1969-01-20 1974-08-09 Republican
2 Ford 1974-08-09 1977-01-20 Republican
3 Carter 1977-01-20 1981-01-20 Democratic
4 Reagan 1981-01-20 1989-01-20 Republican
5 Bush 1989-01-20 1993-01-20 Republican
6 Clinton 1993-01-20 2001-01-20 Democratic
> yrng <- range(economics$unemploy)
> xrng <- range(economics$date)
> unemp + geom_vline(aes(xintercept = as.numeric(start)), data = presidential)1
2
3
4
5> library(scales)
> unemp +
geom_rect(aes(NULL, NULL, xmin = start, xmax = end, fill = party), ymin = yrng[1], ymax = yrng[2], data = presidential, alpha = 0.2) +
scale_fill_manual(values = c('blue', 'red'))
> last_plot() + geom_text(aes(x = start, y = yrng[1], label = name), data = presidential, size = 3, hjust = 0, vjust = 0)1
2
3
4> caption <- paste(strwrap('Unenployment rates in the US have varied a lot over the years', 40), collapse = '\n')
> unemp + geom_text(aes(x, y, label = caption), data = data.frame(x = xrng[2], y = yrng[2]), hjust = 1, vjust = 1, size = 4)
> highest <- subset(economics, unemploy == max(unemploy))
> unemp + geom_point(data = highest, size = 3, colour = 'red', alpha = 0.5)
3.4 含权数据
对于线和点这类简单的几何对象可以根据点的数量调整图形属性size来改变点的大小1
2
3
4> qplot(percwhite, percbelowpoverty, data = midwest, size = poptotal / 1e6) +
+ scale_size_area('Population\n(millions)', breaks = c(0.5, 1, 2, 4))
> qplot(percwhite, percbelowpoverty, data = midwest, size = area) +
+ scale_size_area()
对于更复杂的、涉及到统计变换的情况,通过修改weight图形属性来表现权重。这些权重将被传递给统计汇总计算函数。在权重有意义的情况下,各种元素基本都支持权重的设定, 例如,各类平滑器、分位回归、箱线图、直方图以及各类密度图。1
2
3
4#未考虑权重的最优拟合曲线(左图)和以人口数量作为权重的最佳拟合曲线(右图)
> lm_smooth <- geom_smooth(method = lm, size = 1)
> qplot(percwhite, percbelowpoverty, data = midwest) + lm_smooth
> qplot(percwhite, percbelowpoverty, data = midwest, weight = popdensity, size = popdensity) + lm_smooth1
2
3> qplot(percbelowpoverty, data = midwest, binwidth = 1)
> qplot(percbelowpoverty, data = midwest, weight = poptotal, binwidth = 1) +
+ ylab('population')
不含权重信息的直方图展示了郡的数量,而含权重信息的直方图展示了人口数量。权重的加入的确极大地改变了对图形的解读。
- 本笔记基于Hadley Wickham的《ggplot2:数据分析与图形艺术》整理