R语言Ternary包绘制三元图、RGB三色空间分布图的方法

2023-10-09 03:59

本文主要是介绍R语言Ternary包绘制三元图、RGB三色空间分布图的方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  本文介绍基于R语言中的Ternary包,绘制三元图(Ternary Plot)的详细方法;其中,我们就以RGB三色分布图为例来具体介绍。

  三元图可以从三个不同的角度反应数据的特征,因此在很多领域都得以广泛应用;如下图所示,就是一个最简单的三元图。其中,基于R语言中的Ternary包,我们可以非常方便地绘制三元图;本文就对其具体绘制方法加以介绍。

在这里插入图片描述

  首先,由于我们需要用到R语言中的Ternary包,因此通过如下所示的代码配置Ternary包。

install.packages("Ternary")

  Ternary包提供了两种绘制三元图的方法。首先,我们可以通过其提供的交互式界面,通过鼠标操作完成简单的三元图的绘制工作。我们可以通过如下所示的代码打开这一交互式界面。

Ternary::TernaryApp()

  交互式界面打开后,如下图所示。我们可以按照其中各个按钮、参数的介绍,手动对三元图加以修改,并最终导出图像。

在这里插入图片描述

  我们这里主要介绍基于代码的绘图方法,因此交互式界面就不再过多介绍了;大家如果有需要,可以对交互式界面绘图的方法加以自行尝试。

  首先,通过代码绘制三元图,我们需要导入Ternary包。

library(Ternary)

  最简单的三元图绘制方式,就是通过图下的代码,生成一个最基本的三元图。

TernaryPlot()

  运行上述代码,将得到如下所示的图片。

在这里插入图片描述

  当然,我们需要结合实际的需求,对这个简单的三元图加以个性化修改。首先,本文所用到的全部代码如下所示。

library(Ternary)
# dev.off()TernaryPlot(alab = "Terrain \u2192", blab = "Vegetation \u2192", clab = "\u2190 Climate",lab.col = c("red", "green", "blue"),main = "Test Ternary Plot",point = "up", lab.cex = 0.8, grid.minor.lines = 0,grid.lty = "solid", col = rgb(0.9, 0.9, 0.9), grid.col = "white",axis.col = rgb(0.6, 0.6, 0.6), ticks.col = rgb(0.6, 0.6, 0.6),axis.rotate = FALSE,padding = 0.08)cols <- TernaryPointValues(rgb)
ColourTernary(cols, spectrum = NULL)data_points <- list(O = c(255, 128, 0),Y = c(255, 255, 0),P = c(255, 0, 255),C = c(0, 255, 255)
)
AddToTernary(points, data_points, pch = 21, cex = 2.8,bg = vapply(data_points,function (x) rgb(x[1], x[2], x[3], 255, maxColorValue = 255),character(1)))
AddToTernary(text, data_points, names(data_points),cex = 0.8, font = 2)legend("topright",legend = c("Orange", "Yellow", "Purple", "Cyan"),cex = 0.8, bty = "n", pch = 21, pt.cex = 1.8,pt.bg = c(rgb(255, 128, 0, 255, NULL, 255),rgb(255, 255, 0, 255, NULL, 255),rgb(255, 0, 255, 255, NULL, 255),rgb(0, 255, 255, 255, NULL, 255)),)

  运行上述代码,我们得到的最终结果图像如下图所示。

在这里插入图片描述

  接下来,我们就对上述代码加以介绍与解释。这里需要注意,本文仅对我们用到的参数加以简单的介绍,其中很多参数的含义其实我也还没太搞清楚;大家在实际使用时,如果对参数还有其他疑惑,可以参考Ternary包的官方帮助文档:https://ms609.github.io/Ternary/reference/index.html。

  首先,代码中的第一部分,即TernaryPlot()函数,就是Ternary包绘制三元图的基本函数;我们通过修改其中各项参数,从而修改最终成图中各个部分的属性。其中,函数的第一行,也就是alab开头的这一行,表示三角形三条边分别要显示的字符,也就是“标注”;lab.col则表示三角形中三条边对应的坐标轴的文字标注,需要用什么颜色来表示;main表示三元图的标题point表示三角形摆放的角度(例如我这里的"up"就表示将其中的一个角朝上放置);其后的两个参数lab.cexgrid.minor.lines,则分别表示坐标轴的标注的字号与三元图的最小单位格网线;由于我这里是做一张三角形分别表示RGB三种颜色的颜色空间图,因此就没有设置格网线。

  随后,函数第五行的grid.lty表示三元图格网线的类型,其后的参数col表示三元图内部的绘制颜色,随后的参数grid.col表示格网线的颜色(当然我这里并没有设置格网线);接下来的参数axis.col表示三元图三条轴的颜色,参数ticks.col则表示三条轴上对应的标签(不是文字标注)的颜色;参数axis.rotate则表示是否要旋转标签;最后一个padding参数则用以控制图片的缩放

  接下来,由于我们希望通过RGB三种颜色的填充来实现三元图的着色,因此声明一个cols变量,并通过ColourTernary()函数将其填充到三元图中。

  此外,为了方便大家看图,我们希望在这个三角形的RGB颜色空间图中,添加几个关键颜色的点,作为大家看图时的参考。因此,我们通过RGB值来确定几个颜色点,将其存储在data_point中;随后,通过AddToTernary()函数将其导入三元图中。

  接下来,也就是代码中的最后一部分,我们通过legend()函数为图片添加图例。这里的图例,其实就是我们在前一步骤中,为图片添加的几个主要颜色点的图例。首先,函数的第一个参数"topright",表示我们希望将图例添加到图片的右上角;随后的几行参数,就是调整图例的字体、字号、要显示的内容等。

  在通过调整代码,获得我们满意的三元图后,如果大家是用RStudio进行代码的撰写,可以在“Plots”中选择“Export”→“Save as Image…”选项,将图片导出;如下图所示。

在这里插入图片描述

  不过这里需要注意,在RStudio中导出的图片往往清晰度不够高;如果大家希望提升图片的精度,可以选择导出.eps格式的图片素材;如下图所示。

在这里插入图片描述

  随后,在Adobe IllustratorAI)软件中打开刚刚保存的.eps格式文件;此时,不仅可以直接对图片加以进一步修改,还可以用图片格式保存更高精度的图片。

在这里插入图片描述

  至此,大功告成。

欢迎关注:疯狂学习GIS

这篇关于R语言Ternary包绘制三元图、RGB三色空间分布图的方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/170169

相关文章

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

Python中 try / except / else / finally 异常处理方法详解

《Python中try/except/else/finally异常处理方法详解》:本文主要介绍Python中try/except/else/finally异常处理方法的相关资料,涵... 目录1. 基本结构2. 各部分的作用tryexceptelsefinally3. 执行流程总结4. 常见用法(1)多个e

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

Three.js构建一个 3D 商品展示空间完整实战项目

《Three.js构建一个3D商品展示空间完整实战项目》Three.js是一个强大的JavaScript库,专用于在Web浏览器中创建3D图形,:本文主要介绍Three.js构建一个3D商品展... 目录引言项目核心技术1. 项目架构与资源组织2. 多模型切换、交互热点绑定3. 移动端适配与帧率优化4. 可

504 Gateway Timeout网关超时的根源及完美解决方法

《504GatewayTimeout网关超时的根源及完美解决方法》在日常开发和运维过程中,504GatewayTimeout错误是常见的网络问题之一,尤其是在使用反向代理(如Nginx)或... 目录引言为什么会出现 504 错误?1. 探索 504 Gateway Timeout 错误的根源 1.1 后端

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

MySQL 表空却 ibd 文件过大的问题及解决方法

《MySQL表空却ibd文件过大的问题及解决方法》本文给大家介绍MySQL表空却ibd文件过大的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录一、问题背景:表空却 “吃满” 磁盘的怪事二、问题复现:一步步编程还原异常场景1. 准备测试源表与数据

python 线程池顺序执行的方法实现

《python线程池顺序执行的方法实现》在Python中,线程池默认是并发执行任务的,但若需要实现任务的顺序执行,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋... 目录方案一:强制单线程(伪顺序执行)方案二:按提交顺序获取结果方案三:任务间依赖控制方案四:队列顺序消