数据可视化:Coplot、组合绘图与Lattice包的应用
1. 双条件变量的Coplot图
在Coplot图中可以加入第三个预测变量,但对于某些数据,加入其他变量后并不会带来太多额外信息。这里以Cruikshanks等人(2006)分析的数据子集为例,数据文件为
SDI2003.txt
。原始研究在2002 - 2003年对爱尔兰的257条河流进行了采样,目的之一是开发一种识别酸敏感水域的新工具,目前是通过测量pH值来实现,但pH值在集水区内变化极大,且受水流条件和地质情况影响。因此提出了钠优势指数(SDI)作为替代指标。在257个采样点中,192个为非森林地区,65个为森林地区。
1.1 分析思路
pH与SDI的关系可能受海拔梯度和森林覆盖情况的影响,这需要在两个连续变量(SDI和海拔)和一个分类变量(森林覆盖情况)之间计算一个三向交互项。在将这种交互项纳入模型之前,可以使用Coplot图来可视化这些关系。之前使用的是单条件变量的Coplot图,这里使用两个条件变量,并对海拔值进行对数转换。
1.2 R代码实现
setwd("C:/RBook/")
pHEire <- read.table(file = "SDI2003.txt", header = TRUE)
pHEire$LOGAlt <- log10(pHEire$Altitude)
pHEire$fForested <- factor(pHEire$Forested)
coplot(pH ~ SDI | LOGAlt * fForested, panel = panel.lm, data = pHEire)
这里使用的
panel.lm
函数与之前相同,如果R关闭后重新打开,需要将其复制粘贴到R控制台。由于
LOGAlt
是对数转换后的海拔数值变量,它会被划分为多个条件区间,在每个区间内绘制pH与SDI的关系图,同时数据会根据森林覆盖因子进行分组。
LOGAlt
的区间数量和位置可以通过
given.values
参数控制,也可以使用
number
参数。例如:
coplot(pH ~ SDI | LOGAlt * fForested, panel = panel.lm, data = pHEire, number = 2)
这个命令生成的Coplot图面板数量会更少,当Coplot图因面板过多而崩溃时,也可以使用
number
参数。
2. 美化Coplot图
这部分内容稍复杂,可在初次阅读时跳过。之前的图展示了pH与SDI、海拔和森林覆盖情况及其交互关系。为了进一步展示更多信息,制作一个与之前类似的Coplot图,但点的颜色根据温度不同而不同。温度高于平均值的用浅灰色点表示,低于平均值的用深灰色点表示。
2.1 数据处理
pHEire$Temp2 <- cut(pHEire$Temperature, breaks = 2)
pHEire$Temp2.num <- as.numeric(pHEire$Temp2)
cut
函数将温度数据分为两个区间,由于其输出是因子类型,不能直接用于颜色或灰度,所以使用
as.numeric
函数将其转换为数值型,结果是一个包含1和2的向量。
2.2 绘制Coplot图
coplot(pH ~ SDI | LOGAlt * fForested, panel = panel.lm, data = pHEire, number = 3, cex = 1.5, pch = 19, col = gray(pHEire$Temp2.num / 3))
从图中可以看出,在森林覆盖情况为非森林(用2表示)且温度高于平均值时,低SDI值对应高pH值。
3. 组合不同类型的图
R有多种绘图系统,之前的图使用的是基础包
graphics
,
grid
包提供了更多高级功能,可以将不同的图组合成一个图形。这里使用
layout
函数创建复杂的绘图布局,以物种丰富度与NAP的散点图以及每个变量的箱线图为例。
3.1 定义布局矩阵
MyLayOut <- matrix(c(2, 0, 1, 3), nrow = 2, ncol = 2, byrow = TRUE)
MyLayOut
这个矩阵定义了绘图窗口的布局,第一行是2和0,第二行是1和3。在
layout
函数中使用这个矩阵,后续的三个绘图命令将根据矩阵中的数字确定绘图位置。
3.2 设置布局参数
nf <- layout(mat = MyLayOut, widths = c(3, 1), heights = c(1, 3), respect = TRUE)
layout.show(nf)
widths
参数指定列的相对宽度,
heights
参数指定行的高度,
respect = TRUE
确保垂直和水平方向的单位长度相同。
3.3 绘制图形
xrange <- c(min(Benthic$NAP), max(Benthic$NAP))
yrange <- c(min(Benthic$Richness), max(Benthic$Richness))
# 第一个图:散点图
par(mar = c(4, 4, 2, 2))
plot(Benthic$NAP, Benthic$Richness, xlim = xrange, ylim = yrange, xlab = "NAP", ylab = "Richness")
# 第二个图:NAP的箱线图
par(mar = c(0, 3, 1, 1))
boxplot(Benthic$NAP, horizontal = TRUE, axes = FALSE, frame.plot = FALSE, ylim = xrange, space = 0)
# 第三个图:丰富度的箱线图
par(mar = c(3, 0, 1, 1))
boxplot(Benthic$Richness, axes = FALSE, ylim = yrange, space = 0, horiz = TRUE)
需要确保箱线图的范围与散点图的坐标轴范围同步,同时避免图形周围有过多空白,可通过调整
mar
参数来实现。
4. 本章学习的R函数
| 函数 | 用途 | 示例 |
|---|---|---|
pie
| 制作饼图 |
pie(x)
|
pie3D
| 制作3D饼图 |
pie3D(x)
|
par
| 设置图形参数 |
par(...)
|
barplot
| 制作条形图 |
barplot(x)
|
arrows
| 绘制箭头 |
arrows(x1,y1,x2,y2)
|
box
| 在图形周围绘制框 |
box()
|
boxplot
| 制作箱线图 |
boxplot(y)
、
boxplot(y~x)
|
text
| 向图形添加文本 |
text(x,y,"hello")
|
points
| 向现有图形添加点 |
points(x,y)
|
legend
| 添加图例 |
legend("topleft", MyText, lty = c(1,2,3))
|
title
| 添加标题 |
title(MyText)
|
expression
| 允许使用特殊符号 |
ylab = expression(paste(delta^{15}, "N"))
|
pairs
| 创建多面板散点图 |
Pairs(X)
|
coplot
| 创建多面板散点图 |
Coplot(y~x|z)
|
layout
| 允许在同一窗口中绘制多个图形 |
layout(mat,widths,heights)
|
5. 练习
5.1 练习1:使用
pie
函数处理禽流感数据
使用
BirdFludeaths.txt
文件中的数据,制作展示每年总死亡人数和每个国家死亡人数的饼图,并确保标签可读。
5.2 练习2:使用
barchart
和
stripchart
函数处理植被数据集
根据之前计算的八个样带的物种丰富度、均值和标准差,制作均值的条形图并添加标准误差的垂直线。绘制一个图形,将均值绘制成黑点,标准误差绘制成围绕均值的线,观测数据绘制成空心点。
5.3 练习3:使用
boxplot
函数处理植被数据集
使用练习2中的植被数据,制作展示丰富度值的箱线图。
5.4 练习4:使用
boxplot
函数处理寄生虫数据集
使用鳕鱼寄生虫数据集,制作寄生虫数量(强度)与区域、性别、阶段或年份的条件箱线图,尝试不同组合以检测交互作用。
5.5 练习5:使用
dotchart
函数处理猫头鹰数据
制作雏鸟谈判和到达时间的两个克利夫兰点图,以及每晚到达时间的克利夫兰点图。
5.6 练习6:使用
dotchart
函数处理寄生虫数据
使用练习4中的寄生虫数据,根据区域、性别、阶段或年份对寄生虫数量进行分组,制作克利夫兰点图。根据流行率对深度进行分组,制作克利夫兰点图。
5.7 练习7:使用
plot
和
axis
函数处理猫头鹰数据
对雏鸟谈判数据进行对数转换(以10为底),添加1以避免对数为0的问题。绘制转换后的雏鸟谈判数据与到达时间的关系图,并使用01.00、02.00等标签替换到达时间的25、26等标签。绘制相同的图形,但在垂直轴上使用反转换后的值作为标签。
5.8 练习8:使用
legend
函数处理猫头鹰数据
在练习7创建的图形中添加平滑曲线(参考第5章),分别为雄性和雌性数据拟合平滑曲线并叠加到图形上,使用图例区分不同曲线。对食物处理和夜晚数据进行同样的操作。
5.9 练习9:使用
pairs
函数处理植被数据
为植被数据中的所有气候变量制作配对图,并在下部面板添加相关系数,分析图形所传达的信息。
5.10 练习10:使用
coplot
函数处理植被数据
绘制物种丰富度与所选协变量的关系图,条件为样带。
6. Lattice包简介
R中有许多用于绘制特定类型数据图形的函数,
lattice
包可以充分发挥R对高维数据成像的潜力。它实现了贝尔实验室在20世纪90年代初开发的Trellis图形框架。之前介绍的
coplot
函数在展示具有分组结构的数据子集时很有用,
lattice
包在这方面更强大,但需要更多编程工作。
6.1 高级Lattice函数
lattice
的用户界面主要由一些通用的“高级”函数组成,每个函数用于创建特定类型的统计显示。这些函数具有相似的公式接口和大量通用参数,掌握一个函数后,学习其他函数就比较容易。每个高级函数都嵌入了一个默认的面板函数,用于在每个面板中进行绘图。常见的高级函数如下表所示:
| 函数 | 默认显示 |
| ---- | ---- |
|
histogram()
| 直方图 |
|
densityplot()
| 核密度图 |
|
qqmath()
| 理论分位数图 |
|
qq()
| 两样本分位数图 |
|
stripplot()
| 带状图(比较一维散点图) |
|
bwplot()
| 比较箱线图 |
|
dotplot()
| 克利夫兰点图 |
|
barchart()
| 条形图 |
|
xyplot()
| 散点图 |
|
splom()
| 散点图矩阵 |
|
contourplot()
| 曲面等高线图 |
|
levelplot()
| 曲面伪彩色水平图 |
|
wireframe()
| 曲面三维透视图 |
|
cloud()
| 三维散点图 |
|
parallel()
| 平行坐标图 |
6.2 多面板散点图:
xyplot
以荷兰海岸线30个站点15年的温度和盐度数据为例,数据文件为
RIKZENV.txt
。使用
xyplot
函数生成多面板散点图。
6.2.1 代码实现
setwd("C:/RBook")
Env <- read.table(file = "RIKZENV.txt", header = TRUE)
Env$MyTime <- Env$Year + Env$dDay3 / 365
library(lattice)
xyplot(SAL ~ MyTime | factor(Station), type = "l", strip = function(bg, ...) strip.default(bg = 'white', ...), col.line = 1, data = Env)
xyplot
函数的特点包括使用公式、公式中的竖线(管道符号)和
data
参数。公式中波浪号前的变量绘制在y轴,后面的变量绘制在x轴,竖线后面的条件变量会生成多个面板。如果没有条件变量,
xyplot
的结果与普通的
plot
函数类似,数据将绘制在一个面板中。条件变量通常是因子,但也可以是连续变量,使用连续变量时,默认将其每个唯一值视为一个离散水平,可使用
shingle
和
equal.count
函数将其划分为区间。
6.2.2 结果分析
图中数据显示在五行六列的面板中,每个面板对应一个站点。从图中可以看出,一些站点的盐度普遍较低,北海的水盐度约为32,可能是因为靠近河流或其他淡水流入源。不同站点的盐度值不同,盐度较低的站点随时间的波动更大。部分站点的模式相似,可能这些站点位置相近。难以从图中看出数据是否有季节性模式,可以使用
bwplot
函数绘制箱线图进行进一步研究。
通过以上内容,我们学习了如何使用双条件变量的Coplot图、组合不同类型的图以及
lattice
包的高级绘图功能,同时通过练习巩固了所学的R函数。
7. 多面板散点图
xyplot
的深入探究
7.1 条件变量的处理
当使用连续变量作为条件变量时,默认情况下
xyplot
会将每个唯一值视为一个离散水平。但如果连续变量的值过多,会导致面板数量过多,影响图形的可读性。此时可以使用
shingle
和
equal.count
函数将其划分为区间。以下是一个简单的示例说明如何使用
equal.count
函数:
# 假设我们有一个连续变量 continuous_var 作为条件变量
# 首先加载必要的包
library(lattice)
# 将连续变量划分为 5 个区间
Env$Station_group <- equal.count(Env$Station, number = 5)
# 使用新的分组变量绘制多面板散点图
xyplot(SAL ~ MyTime | Station_group, type = "l", strip = function(bg, ...) strip.default(bg = 'white', ...), col.line = 1, data = Env)
这个代码示例展示了如何将连续的
Station
变量划分为 5 个区间,然后使用新的分组变量
Station_group
绘制多面板散点图。
7.2
xyplot
参数详解
xyplot
函数有许多参数可以调整图形的显示效果,除了之前提到的
type
、
strip
和
col.line
参数外,还有一些其他常用的参数。以下是一个参数列表:
| 参数 | 用途 | 示例 |
| ---- | ---- | ---- |
|
xlab
| 设置 x 轴标签 |
xyplot(SAL ~ MyTime | factor(Station), xlab = "时间", data = Env)
|
|
ylab
| 设置 y 轴标签 |
xyplot(SAL ~ MyTime | factor(Station), ylab = "盐度", data = Env)
|
|
main
| 设置图形标题 |
xyplot(SAL ~ MyTime | factor(Station), main = "荷兰海岸线站点盐度随时间变化", data = Env)
|
|
sub
| 设置图形副标题 |
xyplot(SAL ~ MyTime | factor(Station), sub = "数据来源:RIKZENV.txt", data = Env)
|
|
scales
| 设置坐标轴刻度 |
xyplot(SAL ~ MyTime | factor(Station), scales = list(x = list(rot = 45)), data = Env)
# 将 x 轴刻度标签旋转 45 度 |
7.3 多面板散点图的应用场景
多面板散点图可以用于比较不同组之间的关系,例如在上述例子中,我们可以比较不同站点的盐度随时间的变化情况。通过观察不同面板中曲线的趋势、波动情况等,可以发现不同站点之间的差异和相似性。此外,多面板散点图还可以用于分析变量之间的交互作用,例如在有多个条件变量的情况下,观察不同条件组合下变量之间的关系。
8. 不同绘图方式的对比与选择
8.1 Coplot图与
xyplot
的对比
Coplot图和
xyplot
都可以用于展示具有分组结构的数据子集,但它们有一些区别。Coplot图主要用于展示两个连续变量和一个分类变量之间的关系,通过将数据划分为不同的条件区间,在每个区间内绘制两个连续变量的关系图。而
xyplot
则更加灵活,可以处理多个条件变量,并且可以使用连续变量作为条件变量。此外,
xyplot
的默认面板函数可以绘制不同类型的图形,如线条图、散点图、回归直线等。
以下是一个简单的mermaid流程图,展示了Coplot图和
xyplot
的选择过程:
graph LR
A[数据有分组结构] --> B{条件变量类型}
B -->|两个连续变量和一个分类变量| C[Coplot图]
B -->|多个条件变量,可含连续变量| D[xyplot]
8.2 组合绘图与高级绘图系统的选择
在组合不同类型的图时,使用基础包
graphics
的
layout
函数可以创建复杂的绘图布局,但需要手动调整图形的位置和大小。而
grid
包提供了更高级的绘图功能,可以更方便地组合不同的图形,但需要更多的编程知识。如果只是简单地将几个图形组合在一起,可以使用
layout
函数;如果需要创建更复杂的图形布局,如嵌套图形、自定义图形元素等,则可以考虑使用
grid
包。
8.3 饼图、条形图、箱线图等的适用场景
不同类型的图形适用于不同的数据和分析目的。以下是一个简单的表格,总结了常见图形的适用场景:
| 图形类型 | 适用场景 |
| ---- | ---- |
| 饼图 | 展示各部分占总体的比例关系 |
| 条形图 | 比较不同类别之间的数值大小 |
| 箱线图 | 展示数据的分布情况,包括中位数、四分位数、异常值等 |
| 散点图 | 展示两个变量之间的关系 |
| 多面板散点图 | 展示具有分组结构的数据子集之间的关系 |
9. 总结与建议
9.1 总结
通过前面的学习,我们掌握了多种数据可视化的方法,包括双条件变量的Coplot图、组合不同类型的图以及
lattice
包的高级绘图功能。Coplot图可以帮助我们直观地展示变量之间的交互作用,组合绘图可以将不同类型的图形组合在一起,提供更全面的信息。
lattice
包的高级函数,如
xyplot
,可以处理高维数据,展示具有分组结构的数据子集之间的关系。
9.2 建议
- 在使用Coplot图时,注意条件变量的选择和区间的划分,避免面板过多或过少,影响图形的可读性。
- 在组合绘图时,合理安排图形的位置和大小,确保图形之间的比例协调,避免出现过多的空白或重叠。
-
在使用
lattice包的高级函数时,多尝试不同的参数设置,以达到最佳的可视化效果。同时,要注意条件变量的处理,特别是连续变量的分组问题。 - 在选择图形类型时,根据数据的特点和分析目的选择合适的图形,避免使用不恰当的图形导致信息传达不准确。
通过不断地实践和尝试,我们可以更好地利用这些数据可视化工具,深入挖掘数据中的信息,为数据分析和决策提供有力的支持。
10. 拓展学习
10.1 深入学习
lattice
包
lattice
包还有许多其他高级功能和函数,如自定义面板函数、调整图形的主题等。可以通过阅读官方文档和相关书籍,深入学习
lattice
包的使用,进一步提升数据可视化的能力。
10.2 学习其他绘图包
除了
lattice
包,R中还有许多其他优秀的绘图包,如
ggplot2
、
plotly
等。
ggplot2
提供了一种基于语法的绘图方式,可以创建非常美观和复杂的图形;
plotly
可以创建交互式图形,方便用户进行数据探索和展示。可以学习这些绘图包的使用,丰富自己的数据可视化技能。
10.3 实践项目
通过参与实际的数据分析项目,将所学的数据可视化方法应用到实际中,不断积累经验,提高解决实际问题的能力。可以从公开的数据集中选择感兴趣的项目进行实践,也可以参与开源项目或自己的工作项目。
通过以上拓展学习,我们可以不断提升自己的数据可视化能力,更好地应对各种数据分析和展示的需求。
超级会员免费看
1066

被折叠的 条评论
为什么被折叠?



