Подтвердить что ты не робот

Ggjoy facet с ggtree

Можно ли добавить плагин joyplot в качестве панели к сюжету, который включает ggtree, как показано в этих примерах? Примеры joyplots здесь.

Я понимаю, что я мог вручную поместить метки видов для joyplot в том же порядке, что и метки на основе дерева, но я ищу автоматическое решение. Я хотел бы связать строки joyplot с подсказками деревьев автоматически, сродни тому, как данные boxplot связаны с метками наконечника.

Я думаю, что примеры Guangchuang Yu на приведенной выше ссылке предоставляют подходящие данные:

require(ggtree)
require(ggstance)

# generate tree
tr <- rtree(30)

# create simple ggtree object with tip labels
p <- ggtree(tr) + geom_tiplab(offset = 0.02)

# Generate categorical data for each "species"
d1 <- data.frame(id=tr$tip.label, location=sample(c("GZ", "HK", "CZ"), 30, replace=TRUE))

#Plot the categorical data as colored points on the tree tips
p1 <- p %<+% d1 + geom_tippoint(aes(color=location))

# Generate distribution of points for each species
d4 = data.frame(id=rep(tr$tip.label, each=20), 
            val=as.vector(sapply(1:30, function(i) 
                            rnorm(20, mean=i)))
            )               

# Create panel with boxplot of the d4 data
p4 <- facet_plot(p1, panel="Boxplot", data=d4, geom_boxploth, 
        mapping = aes(x=val, group=label, color=location))           
plot(p4)

Это дает график ниже: demo ggtree plot

Можно ли создать блокнот вместо boxplot?

Вот код для быстрого набора радостей демо-набора d4 выше:

require(ggjoy)

ggplot(d4, aes(x = val, y = id)) + 
geom_joy(scale = 2, rel_min_height=0.03) + 
scale_y_discrete(expand = c(0.01, 0)) + theme_joy()

Результат: demo joyplot

Я новичок в ggplot2, ggtree и ggjoy, поэтому я совершенно не понимаю, как начать это делать.

4b9b3361

Ответ 1

Примечание. По состоянию на 2017-09-14 пакет ggjoy устарел. Вместо этого используйте пакет ggridges. Чтобы код ниже работал с ggridges, используйте geom_density_ridges вместо geom_joy.


Похоже, вы можете просто заменить geom_boxplot на geom_joy в facet_plot:

facet_plot(p1, panel="Joy Plot", data=d4, geom_joy, 
           mapping = aes(x=val, group=label, fill=location), colour="grey50", lwd=0.3) 

введите описание изображения здесь

Если вы новичок в ggplot2, глава визуализации Data Science с R (книга с открытым исходным кодом автора ggplot2 ) должны быть полезны для изучения основ.

ggjoy и ggtree расширяют возможности ggplot2. Когда такие расширения выполняются хорошо, "очевидная" вещь (с точки зрения обычной грамматики графики ggplot) часто работает, потому что пакет расширения написан таким образом, который пытается быть верным базовому подходу ggplot2.

Вот, моя первая мысль заключалась в том, чтобы просто заменить geom_joy на geom_boxplot, который оказался выполненным. Каждый geom - это просто другой способ визуализации данных, в этом случае график и график плотности. Но вся другая "структура" сюжета остается неизменной, поэтому вы можете просто изменить геометрию и получить новый сюжет, который следует за тем же порядком оси, цветовыми сопоставлениями и т.д. Это будет иметь больше смысла, когда вы получите некоторый опыт работы с ggplot2 грамматики графики.

Здесь несколько иной подход к маркировке левого графика:

p1 = ggtree(tr) %<+% d1 +
  geom_tippoint(aes(color=location), size=6) +
  geom_tiplab(offset=-0.01, hjust=0.5, colour="white", size=3.2, fontface="bold") 

facet_plot(p1, panel="Joy Plot", data=d4, geom_joy, 
           mapping = aes(x=val, group=label, fill=location), colour="grey40", lwd=0.3) 

введите описание изображения здесь

ОБНОВЛЕНИЕ: Это ответ на ваш комментарий, в котором спрашивается, как получить одинаковые пользовательские цвета в обеих панелях фасетов. Вот код для этого с примером данных в вашем вопросе:

p1 = ggtree(tr) %<+% d1 +
  geom_tippoint(aes(color=location), size=5) +
  geom_tiplab(offset=-0.01, hjust=0.5, colour="white", size=3, fontface="bold") +
  scale_colour_manual(values = c("grey", "red3", "blue")) +
  scale_fill_manual(values = c("grey", "red3", "blue"))

facet_plot(p1, panel="Joy Plot", data=d4, geom_joy, 
           mapping = aes(x=val, group=label, fill=location), colour="grey40", lwd=0.3) 

введите описание изображения здесь