首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ggtern创建等高线三值图

ggtern创建等高线三值图
EN

Stack Overflow用户
提问于 2021-09-17 05:40:31
回答 1查看 282关注 0票数 2

我试图创建一个三值情节与轮廓填充使用"ggtern“包。其目的是创建如下所示的类似图,其中每个三角点(EXT;INT;SA)表示一个值MF.

我使用的是"stat_interpolate_tern()“函数,它基于堆栈溢出社区see here的友好支持。然而,由于插值的线性模型,右下角的递减值被忽略了。此外,定义轮廓阈值也不是最优的。到目前为止..。

有没有人知道如何用ggtern来完成这件事?这里的数据和代码示例..。

代码语言:javascript
复制
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)

,谢谢您的支持!

EN

回答 1

Stack Overflow用户

发布于 2021-12-27 22:32:56

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

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

代码语言:javascript
复制
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()

但这只提供了以下几个方面:

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

我帮自己找到了解决办法:

代码语言:javascript
复制
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一起玩一点,才能给整个区域涂上颜色。也许,首先计算一个模型并绘制这个外推法到三角形角点是值得的。

另一种选择:

代码语言:javascript
复制
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()

其结果是:

亲切问候马库斯

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69218262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档