你卡了 發表於 2024-3-27 09:28:00

绘制三元图、颜色空间图:R语言代码

<p>  本文介绍基于<strong>R</strong>语言中的<code>Ternary</code>包,绘制<strong>三元图</strong>(Ternary Plot)的详细方法;其中,我们就以<strong>RGB三色分布图</strong>为例来具体介绍。</p>
<p>  <strong>三元图</strong>可以从三个不同的角度反映数据的特征,因此在很多领域都得以广泛应用;如下图所示,就是一个最简单的三元图。其中,基于<strong>R</strong>语言中的<code>Ternary</code>包,我们可以非常方便地绘制三元图;本文就对其具体绘制方法加以介绍。</p>
<p><img src="https://img2024.cnblogs.com/blog/3080295/202403/3080295-20240327092711208-1142277104.png"></p>
<p>  首先,由于我们需要用到<strong>R</strong>语言中的<code>Ternary</code>包,因此通过如下所示的代码配置<code>Ternary</code>包。</p>
<pre><code class="language-r">install.packages("Ternary")
</code></pre>
<p>  <code>Ternary</code>包提供了两种绘制三元图的方法。首先,我们可以通过其提供的<strong>交互式界面</strong>,通过鼠标操作完成简单的三元图的绘制工作。我们可以通过如下所示的代码打开这一交互式界面。</p>
<pre><code class="language-r">Ternary::TernaryApp()
</code></pre>
<p>  交互式界面打开后,如下图所示。我们可以按照其中各个按钮、参数的介绍,手动对三元图加以修改,并最终导出图像。</p>
<p><img src="https://img2024.cnblogs.com/blog/3080295/202403/3080295-20240327092702351-904897811.png"></p>
<p>  我们这里主要介绍基于<strong>代码</strong>的绘图方法,因此交互式界面就不再过多介绍了;大家如果有需要,可以对交互式界面绘图的方法加以自行尝试。</p>
<p>  首先,通过代码绘制三元图,我们需要导入<code>Ternary</code>包。</p>
<pre><code class="language-r">library(Ternary)
</code></pre>
<p>  最简单的三元图绘制方式,就是通过图下的代码,生成一个最基本的三元图。</p>
<pre><code class="language-r">TernaryPlot()
</code></pre>
<p>  运行上述代码,将得到如下所示的图片。</p>
<p><img src="https://img2024.cnblogs.com/blog/3080295/202403/3080295-20240327092702304-1812051357.png"></p>
<p>  当然,我们需要结合实际的需求,对这个简单的三元图加以个性化修改。首先,本文所用到的全部代码如下所示。</p>
<pre><code class="language-r">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 &lt;- TernaryPointValues(rgb)
ColourTernary(cols, spectrum = NULL)

data_points &lt;- 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, x, x, 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)),
       )
</code></pre>
<p>  运行上述代码,我们得到的最终结果图像如下图所示。</p>
<p><img src="https://img2024.cnblogs.com/blog/3080295/202403/3080295-20240327092702465-302181500.png"></p>
<p>  接下来,我们就对上述代码加以介绍与解释。这里需要注意,本文仅对我们用到的参数加以简单的介绍,其中很多参数的含义其实我也还没太搞清楚;大家在实际使用时,如果对参数还有其他疑惑,可以参考<code>Ternary</code>包的官方帮助文档:https://ms609.github.io/Ternary/reference/index.html 。</p>
<p>  首先,代码中的第一部分,即<code>TernaryPlot()</code>函数,就是<code>Ternary</code>包绘制三元图的基本函数;我们通过修改其中各项参数,从而修改最终成图中各个部分的属性。其中,函数的第一行,也就是<code>alab</code>开头的这一行,表示三角形三条边分别要显示的字符,也就是“<strong>标注</strong>”;<code>lab.col</code>则表示三角形中三条边对应的坐标轴的文字标注,需要用什么<strong>颜色</strong>来表示;<code>main</code>表示三元图的<strong>标题</strong>;<code>point</code>表示三角形摆放的<strong>角度</strong>(例如我这里的<code>"up"</code>就表示将其中的一个角朝上放置);其后的两个参数<code>lab.cex</code>与<code>grid.minor.lines</code>,则分别表示坐标轴的标注的<strong>字号</strong>与三元图的<strong>最小单位格网线</strong>;由于我这里是做一张三角形分别表示<code>R</code>、<code>G</code>、<code>B</code>三种颜色的颜色空间图,因此就没有设置格网线。</p>
<p>  随后,函数第五行的<code>grid.lty</code>表示三元图格网线的<strong>类型</strong>,其后的参数<code>col</code>表示三元图内部的绘制<strong>颜色</strong>,随后的参数<code>grid.col</code>表示格网线的<strong>颜色</strong>(当然我这里并没有设置格网线);接下来的参数<code>axis.col</code>表示三元图三条轴的<strong>颜色</strong>,参数<code>ticks.col</code>则表示三条轴上对应的<strong>标签</strong>(不是文字标注)的颜色;参数<code>axis.rotate</code>则表示是否要<strong>旋转标签</strong>;最后一个<code>padding</code>参数则用以控制图片的<strong>缩放</strong>。</p>
<p>  接下来,由于我们希望通过<code>R</code>、<code>G</code>、<code>B</code>三种颜色的填充来实现三元图的着色,因此声明一个<code>cols</code>变量,并通过<code>ColourTernary()</code>函数将其填充到三元图中。</p>
<p>  此外,为了方便大家看图,我们希望在这个三角形的<code>R</code>、<code>G</code>、<code>B</code>颜色空间图中,添加几个关键颜色的点,作为大家看图时的参考。因此,我们通过<code>R</code>、<code>G</code>、<code>B</code>值来确定几个颜色点,将其存储在<code>data_point</code>中;随后,通过<code>AddToTernary()</code>函数将其导入三元图中。</p>
<p>  接下来,也就是代码中的最后一部分,我们通过<code>legend()</code>函数为图片添加<strong>图例</strong>。这里的图例,其实就是我们在前一步骤中,为图片添加的几个主要颜色点的图例。首先,函数的第一个参数<code>"topright"</code>,表示我们希望将图例添加到图片的右上角;随后的几行参数,就是调整图例的字体、字号、要显示的内容等。</p>
<p>  在通过调整代码,获得我们满意的三元图后,如果大家是用<strong>RStudio</strong>进行代码的撰写,可以在“<strong>Plots</strong>”中选择“<strong>Export</strong>”→“<strong>Save as Image...</strong>”选项,将图片导出;如下图所示。</p>
<p><img src="https://img2024.cnblogs.com/blog/3080295/202403/3080295-20240327092702362-1600323230.png"></p>
<p>  不过这里需要注意,在<strong>RStudio</strong>中导出的图片往往清晰度不够高;如果大家希望提升图片的精度,可以选择导出<code>.eps</code>格式的图片素材;如下图所示。</p>
<p><img src="https://img2024.cnblogs.com/blog/3080295/202403/3080295-20240327092702321-1038553610.png"></p>
<p>  随后,在<strong>Adobe Illustrator</strong>(<strong>AI</strong>)软件中打开刚刚保存的<code>.eps</code>格式文件;此时,不仅可以直接对图片加以进一步修改,还可以用图片格式保存更高精度的图片。</p>
<p><img src="https://img2024.cnblogs.com/blog/3080295/202403/3080295-20240327092702618-1472258444.png"></p>
<p>  至此,大功告成。</p><br><br>
来源:https://www.cnblogs.com/fkxxgis/p/18098190
頁: [1]
查看完整版本: 绘制三元图、颜色空间图:R语言代码