2

我正在尝试使用库 ggtern 创建一个三元轮廓填充图。使用的代码是

a <- c(0.50, 0.625, 0.375, 0.25, 0.5625, 0.125, 0.25, 0.3125, 0.375, 0.4375, 0.1875, 0.3125, 0.375, 0.4375)
b <- c(0.25, 0.1875, 0.3125, 0.375, 0.25, 0.4375, 0.25, 0.375, 0.375, 0.4375, 0.875, 0.3125, 0.25, 0.125)
c <- c(0.25, 0.1875, 0.3125, 0.375, 0.1875, 0.4375, 0.50, 0.3125, 0.25, 0.125, 0.625, 0.375, 0.375, 0.4375) 
d <- c(77.82325, 74.59318767, 76.76495015, 76.62122282, 77.95608657, 76.91320817, 68.50986659,8.53724416,80.32237597, 85.43315399, 61.80292426, 74.71471485, 73.27176908, 67.51782848)
df <- data.frame(a, b, c, d)

df$id <- 1:nrow(df)

#Build Plot
ggtern(data = df,aes(x = c,y = a,z = b)) +
stat_density2d(geom = "polygon", n = 400, aes(fill = ..level.., weight = d, alpha = abs(..level..))) +
geom_density_tern(aes(weight = d,color = ..level..), n = 400) +
geom_point(aes(fill = d),color = "black",size = 5,shape = 21) +
geom_text(aes(label = id),size = 3) +
labs(x = "X (%)",y = "Y (%)",z = "Z (%)",title = "Title", size = 3) +
scale_fill_gradient2(low = "green", mid = "yellow", high = "red", midpoint = 10) +
scale_color_gradient2(low = "green", mid = "yellow", high = "red", midpoint = 10) +
theme_custom(base_size = 12, base_family = "", col.T = "black", col.L = "black", col.R = "black", col.BG = "white") +
tern_anticlockwise() +
tern_limits(breaks = seq(0.1,1,by = 0.1)) + #AFFECT ALL SCALES
theme(axis.tern.arrowstart = 0.4,axis.tern.arrowfinish = 0.6) +
theme(legend.justification = c(0,1), legend.position = c(0,1)) +
guides(fill = guide_colorbar(order = 1), alpha = guide_legend(order = 2), color = "none") +
labs( title = "Ternary filled contour plot", fill = "Value, V",alpha = "|V - 0|")

但我收到以下警告消息:

Error: coord_tern requires the following missing aesthetics: z

为什么会发生此错误以及如何解决?请帮忙

4

2 回答 2

5

@jhoward,感谢您对问题的解释。

我还想在最新版本的 ggtern 中演示一些附加功能。请参阅下面的插值几何,用于表面建模:

ggtern(data = df,aes(x = c,y = a, z = b)) + 
  geom_interpolate_tern(aes(value=d,colour=..level..),bins=50) +
  geom_point(aes(color=d),size=10) + 
  geom_text(aes(label=round(d,0)),size=3) + 
  theme_bw() + 
  theme(legend.position=c(0,1),
        legend.justification=c(0,1)) + 
  scale_colour_gradient(low='green',high='red') + 
  labs( title = "Ternary filled contour plot", colour = "Value, V")

产生以下输出:

示例轮廓

于 2015-09-10T02:53:03.643 回答
2

当发生这样的事情时,显而易见的方法是解构代码以查看错误发生的确切位置。如果你这样做了,你就会知道它是在调用stat_density2d(...). 我根本无法制作工作ggtern版本stat_density2d(...)(尽管我很想看到其他人做的例子)。

如果您删除该调用,并将fill=..level..美学放入geom_density_tern(...),您会得到:

library(ggtern)
ggtern(data = df,aes(x = c,y = a, z = b)) +
  geom_density_tern(aes(fill=..level..),n = 400) +
  geom_point(aes(fill = d),color = "black",size = 5,shape = 21) +
  geom_text(aes(label = id),size = 3) +
  labs(x = "X (%)",y = "Y (%)",z = "Z (%)",title = "Title", size = 3) +
  scale_fill_gradient2(low = "green", mid = "yellow", high = "red", midpoint = 10) +
  scale_color_gradient2(low = "green", mid = "yellow", high = "red", midpoint = 10) +
  theme_custom(base_size = 12, base_family = "", col.T = "black", col.L = "black", col.R = "black", col.BG = "white") +
  tern_anticlockwise() +
  tern_limits(breaks = seq(0.1,1,by = 0.1)) + #AFFECT ALL SCALES
  theme(axis.tern.arrowstart = 0.4,axis.tern.arrowfinish = 0.6) +
  theme(legend.justification = c(0,1), legend.position = c(0,1)) +
  guides(fill = guide_colorbar(order = 1), alpha = guide_legend(order = 2), color = "none") +
  labs( title = "Ternary filled contour plot", fill = "Value, V",alpha = "|V - 0|")

注意轮廓填充是如何全是黄色的。发生这种情况是因为您尝试将 fill 用于两种不同的事物:z 级别(来自 column b)和 fill 来自 column 的点dggplot(并gggtern通过扩展)创建一个单一的填充比例。由于df$b大致在 (0.1, 1) 和df$d大致在 (60,90) 范围内,等高线填充水平都在该范围的低端,因此是黄色的。

如果您真的想要为轮廓填充和点使用不同的调色板,您可以对点使用颜色美学:

library(ggtern)
ggtern(data = df,aes(x = c,y = a, z = b)) +
  geom_density_tern(aes(fill=..level..),n = 400) +
  geom_point(aes(color = d),size = 8,shape = 20) +
  geom_text(aes(label = id),size = 3) +
  labs(x = "X (%)",y = "Y (%)",z = "Z (%)",title = "Title", size = 3) +
  scale_fill_gradient2(low = "green", mid = "yellow", high = "red", midpoint = 10) +
  scale_color_gradient2(low = "green", mid = "yellow", high = "red", midpoint = 10) +
  theme_custom(base_size = 12, base_family = "", col.T = "black", col.L = "black", col.R = "black", col.BG = "white") +
  tern_anticlockwise() +
  tern_limits(breaks = seq(0.1,1,by = 0.1)) + #AFFECT ALL SCALES
  theme(axis.tern.arrowstart = 0.4,axis.tern.arrowfinish = 0.6) +
  theme(legend.justification = c(0,1), legend.position = c(0,1)) +
  guides(fill = guide_colorbar(order = 2), color = guide_colorbar(order = 1)) +
  labs( title = "Ternary filled contour plot", color = "Value, V", fill = "|V - 0|")

编辑:根据 OP 的评论添加。

ggtern(data = df,aes(x = c,y = a, z = b)) +
  geom_density_tern(aes(fill=..level..),n = 400) +
  geom_point(aes(color = d),size = 8,shape = 20) +
  geom_text(aes(label = id),size = 3) +
  labs(x = "X (%)",y = "Y (%)",z = "Z (%)",title = "Title", size = 3) +
  scale_fill_gradient2(low = "green", mid = "yellow", high = "red", midpoint = 10) +
  scale_color_gradient2(low = "green", mid = "yellow", high = "red", limits=c(60,90),midpoint = 75) +
  theme_custom(base_size = 12, base_family = "", col.T = "black", col.L = "black", col.R = "black", col.BG = "white") +
  tern_anticlockwise() +
  tern_limits(breaks = seq(0.1,1,by = 0.1)) + #AFFECT ALL SCALES
  theme(axis.tern.arrowstart = 0.4,axis.tern.arrowfinish = 0.6) +
  theme(legend.justification = c(0,1), legend.position = c(0,1)) +
  guides(fill = guide_colorbar(order = 2), color = guide_colorbar(order = 1)) +
  labs( title = "Ternary filled contour plot", color = "Value, V", fill = "|V - 0|")

于 2015-09-04T07:15:36.597 回答