2

我正在尝试使用“ggtern”包创建一个带有轮廓填充的三元图。目的是创建一个类似的图,如下所示,其中每个三角剖分点 (EXT;INT;SA) 表示一个值 MF...

在此处输入图像描述

我正在使用“stat_interpolate_tern()”函数,基于 stackoverflow 社区的友好支持,请参见此处。然而,由于插值的线性模型,右下角的递减值会丢失。定义轮廓阈值也不是最佳的。到目前为止我得到的...

在此处输入图像描述

有谁知道,如何用 ggtern 做到这一点?这里的数据和代码示例...

SA <- c(1.0, 0.0, 0.0, 0.0, 0.0, 0.9, 0.9, 0.1, 0.1, 0.8, 0.0, 0.0, 0.2, 0.2, 0.8, 0.3, 0.7, 0.0, 0.0, 0.3, 0.7, 0.0, 0.4, 0.0, 0.6, 0.6, 0.4, 0.5, 0.0, 0.5, 0.1, 0.1, 0.8, 0.7, 0.1, 0.2, 0.1, 0.7,
    0.2, 0.6, 0.1, 0.1, 0.6, 0.3, 0.3, 0.1, 0.5, 0.1, 0.4, 0.5, 0.4, 0.6, 0.2, 0.2, 0.3, 0.5, 0.2, 0.5, 0.2, 0.3, 0.4, 0.4, 0.2, 0.3, 0.3, 0.4)
INT <- c(0.0, 0.0, 1.0, 0.1, 0.9, 0.0, 0.1, 0.9, 0.0, 0.0, 0.8, 0.2, 0.8, 0.0, 0.2, 0.0, 0.3, 0.7, 0.3, 0.7, 0.0, 0.6, 0.0, 0.4, 0.0, 0.4, 0.6, 0.5, 0.5, 0.0, 0.1, 0.8, 0.1, 0.1, 0.2, 0.7, 0.7, 0.2,
     0.1, 0.1, 0.3, 0.6, 0.3, 0.6, 0.1, 0.4, 0.1, 0.5, 0.1, 0.4, 0.5, 0.2, 0.6, 0.2, 0.5, 0.3, 0.3, 0.2, 0.5, 0.2, 0.4, 0.2, 0.4, 0.4, 0.3, 0.3)
EXT <- c(0.0, 1.0, 0.0, 0.9, 0.1, 0.1, 0.0, 0.0, 0.9, 0.2, 0.2, 0.8, 0.0, 0.8, 0.0, 0.7, 0.0, 0.3, 0.7, 0.0, 0.3, 0.4, 0.6, 0.6, 0.4, 0.0, 0.0, 0.0, 0.5, 0.5, 0.8, 0.1, 0.1, 0.2, 0.7, 0.1, 0.2, 0.1,
     0.7, 0.3, 0.6, 0.3, 0.1, 0.1, 0.6, 0.5, 0.4, 0.4, 0.5, 0.1, 0.1, 0.2, 0.2, 0.6, 0.2, 0.2, 0.5, 0.3, 0.3, 0.5, 0.2, 0.4, 0.4, 0.3, 0.4, 0.3)
MF <- c(1.433, 0.251, 0.000, 0.176, 0.000, 1.556, 1.490, 0.087, 0.522, 1.718, 0.000, 0.098, 0.347, 0.772, 1.642, 1.093, 1.762, 0.000, 0.052, 0.713, 1.857, 0.000, 1.367, 0.022, 1.814,
       1.726, 1.043, 1.424, 0.001, 1.722, 0.428, 0.122, 1.656, 1.798, 0.330, 0.384, 0.138, 1.777, 0.661, 1.763, 0.271, 0.166, 1.733, 0.753, 0.984, 0.236, 1.574, 0.204, 1.232, 1.471,
       1.086, 1.748, 0.409, 0.568, 0.790, 1.505, 0.520, 1.552, 0.451, 0.884, 1.094, 1.180, 0.484, 0.831, 0.859, 1.123)
df <- data.frame(SA,INT,EXT,MF)

library(ggtern)
library(viridis)

ggtern(df, aes(INT, EXT,SA, value = MF)) +
  stat_interpolate_tern(geom="polygon",
                        formula = value~y+x,
                        method = lm, n = 100,
                        breaks = seq(0, 2.5, length.out = 9),
                        aes(fill = ..level..), expand = 1) +
  scale_fill_viridis()+
  labs(fill = "MultiF.") +
  theme_rgbw() +
  theme(tern.panel.grid.ontop = TRUE)

预先感谢您对我们的支持!

4

1 回答 1

1

使用 ggtern,我在提供正确的插值方面也遇到了一些困难。特别是,多边形有点棘手。

当您切换到stat = "InterpolateTern"而不是stat = "polygon",您可以重现您的示例,以及和中的重要base = "identity"更改method = "auto"

ggtern(df,
  aes(INT, EXT,SA, value = MF)) +
    geom_interpolate_tern(
        stat = "InterpolateTern",
        method = "auto",
        na.rm = TRUE,
        formula = value ~ x + y,
        expand = 0,
        base = "identity",
        aes(
            colour = after_stat(level)
        ),
        breaks = seq(0,1.75, length.out = 9),
        size = 2
    ) + scale_colour_viridis() +
    theme_rgbw()

但这仅给出计数:

在此处输入图像描述

由于多边形通常被截断,我无法生成基于多边形的图来提供所需的输出。

在此处输入图像描述

我帮助自己解决了一个问题:

ggtern(df, 
             aes(INT, EXT,SA, value = MF)) +
    geom_interpolate_tern(
        stat = "InterpolateTern",
        method = "auto",
        na.rm = TRUE,
        formula = value ~ x + y,
        expand = 0,
        base = "identity",
        aes(
            colour = after_stat(level)
        ),
        breaks = seq(0,1.8, length.out = 500),
        size = 5
    ) +
    geom_interpolate_tern(
        stat = "InterpolateTern",
        method = "auto",
        na.rm = TRUE,
        formula = value ~ x + y,
        expand = 0,
        base = "identity",
        aes(
            colour = after_stat(level)
        ),
        breaks = seq(0, 1.75, length.out = 9),
        size = 1,
        colour = "white"
    )+  scale_colour_viridis() +
    theme_rgbw() + 
    theme_gridsontop()

这提供:

在此处输入图像描述

你必须玩一点breakssize为整个区域着色。或许,值得首先计算一个模型并将其绘制到三角形角上。

另一种选择:

ggtern(df, 
             aes(INT, EXT,SA, value = MF)) +
    geom_hex_tern(
        stat = "hex_tern",
        fun = "mean",
        na.rm = TRUE,
        binwidth = .1 # depends on your data granularity  
    ) +
    scale_fill_viridis() +
    theme_rgbw() + 
    theme_gridsontop()

导致:

在此处输入图像描述

亲切的问候马库斯

于 2021-12-27T22:32:56.513 回答