【问题标题】:ggtern - create contoured ternary plotggtern - 创建轮廓三元图
【发布时间】:2021-09-17 05:40:31
【问题描述】:

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

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

有没有人知道,如何用 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)

提前感谢您的支持!

【问题讨论】:

    标签: r ggplot2 heatmap ternary ggtern


    【解决方案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()
    

    导致:

    亲切的问候 马库斯

    【讨论】:

    • 亲爱的 Markus,非常感谢您的帮助!六边形的变体很棒!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多