Аспект ggjoy с ggtree

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

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

Я думаю, что примеры 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)

Это дает сюжет ниже: демонстрационный сюжет

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

Вот код для быстрого джойплота демонстрационного набора данных 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()

Результат: демо-джойплот

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

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

Другие вопросы по тегам