2015-09-04 1 views
2

Я пытаюсь создать тройной контурный сюжет с библиотекой 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 

Почему происходит эта ошибка и как это исправить? Пожалуйста, помогите

+0

Добро пожаловать на SO. +1 для предоставления набора данных, чтобы продемонстрировать проблему. В будущем, пожалуйста, укажите * минимальный * воспроизводимый пример. См. [Этот пост] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example/5963610#5963610) о том, как это сделать. По сути, это означает, что вы удалите весь код, который не имеет отношения к проблеме. – jlhoward

ответ

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. ggplotgggtern по расширению) создает единую шкалу заполнения. Так как 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|") 

Edit: Добавить согласно комментарию 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|") 

+0

Привет, @jlhoward !, Спасибо за ответ. Мне нужно заполнить z-уровень и точки из столбца d, и мне нужно изменить диапазон значений только 60 -90. Не могли бы вы помочь мне сделать это? ваша помощь будет действительно оценена. –

+0

Как это отличается от второго изображения?(Кстати: похоже, что я только что опубликовал один и тот же код дважды - моя ошибка. Он был отредактирован так, что теперь второй фрагмент действительно создает второе изображение.) Чтобы изменить диапазон значений цвета, используйте 'limits = c (60,90) 'в вызове' scale_color_gradient2 (...) 'и изменить среднюю точку на, например, 75. – jlhoward

+0

привет @jlhoward! Мне нужно заполнить z-уровень из столбца d и изменить диапазон цветов 60-90. Я изменил пределы = c (60,90) в вызове scale_color_gradient2 (...). Но я не работал. Не могли бы вы опубликовать код для меня с этими изменениями. ваша помощь будет действительно оценена. –

4

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

который производит следующий вывод:

example contour

+0

привет @jlhoward! , Большое вам спасибо за вашу помощь . Мне нужно заполнить z-уровень и градиент контурных линий в соответствии с переменной d (из столбца d). Мне нужен сюжет, как предыдущий, с d заполненными контурными линиями и градиентом (который не является геометрией интерполяции). Но этот график геометрии интерполяции действительно впечатляет. благодаря –