R学习:R for Data Science(三)
R语言学习系列
今天我们来继续学习R for Data Science
统计变换
接下来我们看一下条形图。条形图虽然简单,但很有意思,因为它可以揭示出图形中的一些微妙信息。我们看一下用 geom_bar() 函数就可以绘制的基本条形图。下面的条形图显示了 diamonds 数据集中按照 cut 变量分组的各种钻石的总数量。diamonds 数据集是 ggplot2的内置数据集,包含大约 54 000 颗钻石的信息,每颗钻石具有 price、 carat、 color、clarity 和 cut 变量。条形图显示,高质量切割钻石的数量要比低质量切割钻石的数量多:
rm(list = ls())
library(tidyverse)
library(ggplot2)
data = diamonds
ggplot(data = diamonds) +
geom_bar(mapping = aes(x = cut))
条形图 x 轴显示的是 cut,这是 diamonds 数据集中的一个变量。y 轴显示的是 count,但count 不是 diamonds 中的变量!那么 count 来自哪里呢?很多图形绘制的是数据集的原始数据,比如散点图。另外一些图形则可以绘制那些计算出的新数据,比如条形图。
·条形图、直方图和频率多边形图可以对数据进行分箱,然后绘制出分箱数量和落在每个 分箱的数据点的数量。
·平滑曲线会为数据拟合一个模型,然后绘制出模型预测值。
·箱线图可以计算出数据分布的多种摘要统计量,并显示一个特殊形式的箱体。
绘图时用来计算新数据的算法称为 stat(statistical transformation, 统计变换)。下图描述了geom_bar() 函数的统计变换过程。
通过查看 stat 参数的默认值,你可以知道几何对象函数使用了哪种统计变换。例如,?geom_bar 显示出 stat 的默认值是 count,这说明 geom_bar() 使用 stat_count() 函数进行统计变换。
通常来说,几何对象函数和统计变换函数可以互换使用。例如,你可以使用 stat_count()替换 geom_bar() 来重新生成前面那张图:
ggplot(data = diamonds) +
stat_count(mapping = aes(x = cut))
可以这样做的原因是,每个几何对象函数都有一个默认统计变换,每个统计变换函数都有一个默认几何对象。一般情况下,这意味着你在使用几何对象函数时不用担心底层的统计变换。想要显式使用某种统计变换的 3 个原因如下。
· 你可能想要覆盖默认的统计变换。在以下代码中,我们将 geom_bar() 函数的统计变换从计数(默认值)修改为标识。这样我们就可以将条形的高度映射为 y 轴变量的初始值。遗憾的是,当随意说起条形图时,人们指的可能就是这种条形图,其中条形高度已经存在于数据中,而不是像前一个图一样,条形高度由对行进行计数来生成:
demo <- tribble(
~a, ~b,
"bar_1", 20,
"bar_2", 30,
"bar_3", 40
)
ggplot(data = demo) +
geom_bar(
mapping = aes(x = a, y = b), stat = "identity"
)
你可能想要覆盖从统计变换生成的变量到图形属性的默认映射。例如显示一张表示比例(而不是计数)的条形图:
ggplot(data = diamonds) +
geom_bar(
mapping = aes(x = cut, y = ..prop.., group = 1)
)
你可能想要在代码中强调统计变换。例如,你可以使用 stat_summary() 函数。stat_summary() 函数为 x 的每个唯一值计算 y 值的摘要统计:
ggplot(data = diamonds) +
stat_summary(
mapping = aes(x = cut, y = depth),
fun.ymin = min,
fun.ymax = max,
fun.y = median
)
ggplot2 提供了 20 多个统计变换以供你使用。每个统计变换都是一个函数,因此你可以按照通用方式获得帮助,例如 ?stat_bin。如果想要查看全部的统计变换,可以使用 ggplot2速查表(见文末)。
位置调整
条形图还有一项神奇的功能,你可以使用 color 或者 fill(这个更有用)图形属性来为条形图上色:
ggplot(data = diamonds) +
geom_bar(mapping = aes(x = cut, color = cut))
ggplot(data = diamonds) +
geom_bar(mapping = aes(x = cut, fill = cut))
注意,如果将 fill 图形属性映射到另一个变量(如 clarity),那么条形会自动分块堆叠起来。每个彩色矩形表示 cut 和 clarity 的一种组合。
这种堆叠是由 position 参数设定的位置调整功能自动完成的。如果不想生成堆叠式条形图,你还可以使用以下 3 种选项之一:"identity"、 "fill" 和 "dodge"。
· position = "identity" 将每个对象直接显示在图中。这种方式不太适合条形图,因为条形会彼此重叠。为了让重叠部分能够显示出来,我们可以设置 apha 参数为一个较小的数,从而使得条形略微透明;或者设定 fill = NA,让条形完全透明:
ggplot(
data = diamonds,
mapping = aes(x = cut, fill = clarity)
) +
geom_bar(alpha = 1/5, position = "identity")
ggplot(
data = diamonds,
mapping = aes(x = cut, color = clarity)
) +
geom_bar(fill = NA, position = "identity")
· position = "fill" 的效果与堆叠相似,但每组堆叠条形具有同样的高度,因此这种条形图可以非常轻松地比较各组间的比例:
ggplot(data = diamonds) +
geom_bar(
mapping = aes(x = cut, fill = clarity),
position = "fill"
)
· position = "dodge" 将每组中的条形依次并列放置,这样可以非常轻松地比较每个条形表示的具体数值:
坐标系
坐标系可能是 ggplot2 中最复杂的部分。默认的坐标系是笛卡儿直角坐标系,可以通过其独立作用的 x 坐标和 y 坐标找到每个数据点。偶尔也会用到一些其他类型的坐标系。
· coord_flip() 函数可以交换 x 轴和 y 轴。当想要绘制水平箱线图时,这非常有用。它也非常适合使用长标签,但要想在 x 轴上不重叠地安排好它们是非常困难的:
ggplot(mpg,aes(x = class, y = hwy)) +
geom_boxplot()
ggplot(data = mpg, mapping = aes(x = class, y = hwy)) +
geom_boxplot() +
coord_flip()
· coord_polar() 函数使用极坐标系。极坐标系可以揭示出条形图和玫瑰图间的一种有趣联系:
bar <- ggplot(data = diamonds) +
geom_bar(
mapping = aes(x = cut, fill = cut),
show.legend = FALSE,
width = 1
) +
theme(aspect.ratio = 1) +
labs(x = NULL, y = NULL)
bar + coord_flip()
bar + coord_polar()
看到这个图,想到昨天看的人民日报上的图
总结
在前面几节中,我们学到的绝不仅仅是如何绘制散点图、条形图和箱线图,而是使用 ggplot2绘制任何类型图形的基础知识。为了说明这一点,我们向前面的代码模板中添加位置调整、统计变换、坐标系和分面:
ggplot(data = <DATA>) +
<GEOM_FUNCTION>(
mapping = aes(<MAPPINGS>),
stat = <STAT>,
position = <POSITION>
) +
<COORDINATE_FUNCTION> +
<FACET_FUNCTION>
新模板有 7 个参数,即模板中尖括号内的部分。实际上,绘图时几乎不需要提供所有的 7个参数,因为除了数据、映射和几何对象函数, ggplot2 为所有其他参数提供了非常有用的默认设置。模板中的 7 个参数一同组成了图形语法,即用于建立图形的一个正式语法系统。你可以将任何图形精确地描述为数据集、几何对象、映射集合、统计变换、位置调整、坐标系和分面模式的一个组合,图形语法正是基于这样的深刻理解构建出来的。
为了说明图形语法的工作方式,我们看一下如何从头开始构建一个基本图形:首先需要有一个数据集,然后(通过统计变换)将其转换为想要显示的信息。
接下来,你可以选择一个几何对象来表示转换后的数据中的每个观测值,然后选择几何对象的图形属性来表示数据中的变量,这会将每个变量的值映射为图形属性的水平。
下一步是选择放置几何对象的坐标系。你可以使用对象位置(对象本身的一个图形属性)来显示 x 变量和 y 变量的值。这样就生成了一张完整的图。但你还可以进一步调整几何对象在坐标系中的位置(位置调整),或者将图划分为多个子图(分面)。你还可以通过添加一个或多个附加图层对图进行扩展,其中每个附加图层都使用一个数据集、一个几何对象、一个映射集合、一个统计变换和一个位置调整。
你可以使用这种方法构建你能够想象到的任何图形。
好了,第一章我们学习完了。
另外,最近收集了一些很好的资源,分享给大家,顺便能涨一些粉,主要有
1. 19年中标的各门类国自然题目汇总,以及17年的国自然汇总,部分含摘要!
2. R语言学习书籍
R语言实战(中文完整版)
R数据科学(中文完整版)
ggplot2:数据分析与图形艺术
30分钟学会ggplot2
3. TCGA数据整理
前期从https://xenabrowser.net/datapages/ (UCSC Xena)数据库下载的TCGA数据,传到了百度云上备份。
ggplot2速查表pdf(可复制)
感兴趣的话,转发朋友圈或者100人以上的微信群,截图发到公众号,即可获取全部资源的百度云链接,链接7天有效,希望大家赶紧下载。你们的支持是我前进的动力,感谢。