15、数据可视化:Coplot、组合绘图与Lattice包的应用

数据可视化: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 实践项目

通过参与实际的数据分析项目,将所学的数据可视化方法应用到实际中,不断积累经验,提高解决实际问题的能力。可以从公开的数据集中选择感兴趣的项目进行实践,也可以参与开源项目或自己的工作项目。

通过以上拓展学习,我们可以不断提升自己的数据可视化能力,更好地应对各种数据分析和展示的需求。

03-08
### MathPix工具介绍 Mathpix Snipping Tool 是一款强大的数学公式识别工具,从最初的原型发展至今已经历了多次迭代和功能增强[^1]。该工具不仅能处理简单的数学表达式,还可以应对复杂的数学模型以及多行公式,并且支持手写公式的识别。 这款应用程序通过不断的科技创新与用户反馈改进,在学术研究和技术领域赢得了良好声誉,成为许多科研人员不可或缺的工作伙伴之一。除了基本的功能外,Mathpix 还提供了多种高级特性来满足不同用户的特定需求。 ### 使用方法 #### 安装与启动 为了使用 Mathpix Snipping Tool ,首先需要下载安装程序并按照提示完成设置过程。一旦成功安装后即可随时调用此应用来进行截图操作。 #### 截取屏幕上的公式图像 当遇到想要转换成 LaTeX 或 AsciiMath 的图片时,只需打开软件界面按下快捷键(默认为 `Ctrl+Alt+M`),此时鼠标指针会变为十字形状以便于选取目标区域;框选所需部分之后松开按键即刻上传至云端服务器等待进一步分析处理。 #### 获取LaTeX代码片段 经过短暂几秒钟的时间延迟过后,所截获的内容将以纯文本形式显示出来供复制粘贴到其他编辑器当中继续编写文档或是分享给他人查看交流之用。 ```python import pyperclip # 假设已获取到LaTeX字符串 stored_in_variable named latex_code pyperclip.copy(latex_code) print("LaTeX code has been copied to clipboard.") ``` 对于希望深入探索更多可能性的用户来说,可以考虑查阅官方提供的扩展插件——如用于解析Markdown文件内的公式标记语法的库 **mathpix-markdown-it** [^2] ——这将进一步提升工作效率和个人体验感。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值