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

我使用的是"stat_interpolate_tern()“函数,它基于堆栈溢出社区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),谢谢您的支持!
发布于 2021-12-27 22:32:56
有了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()这将提供:

你必须与breaks和size一起玩一点,才能给整个区域涂上颜色。也许,首先计算一个模型并绘制这个外推法到三角形角点是值得的。
另一种选择:
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()其结果是:

亲切问候马库斯
https://stackoverflow.com/questions/69218262
复制相似问题