三元图和填充轮廓 - ggtern

时间:2015-09-04 05:05:30

标签: r plot ggplot2 ggtern

我正在尝试使用库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

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

2 个答案:

答案 0 :(得分:4)

@jhoward,谢谢你对这个问题的解释。

我还希望在更新版本的ggtern中演示一些其他功能。请参见下面的插值几何,用于曲面建模:

Double

产生以下输出:

example contour

答案 1 :(得分: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|")

注意轮廓填充是如何全黄色的。之所以发生这种情况,是因为您尝试将填充用于两个不同的事物:z级(来自列b),以及填充来自列d的点。 ggplot(以及gggtern扩展名)会创建一个填充比例。由于df$b大致在(0.1,1)和df$d大致在范围(60,90)内,因此轮廓填充水平都在该范围的低端,因此是黄色。 / p>

如果你真的想要一个不同的色彩填充和点的调色板,你可以使用颜色审美点:

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|")