ggjoy аспект с ggtree

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

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

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

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)

В результате получается следующий график: демонстрационный график ggtree

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

Вот код для быстрого построения графика демонстрационных данных 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, поэтому я совершенно не понимаю, как вообще начать это делать.


person LCM    schedule 29.07.2017    source источник
comment
Можете ли вы предоставить некоторые подходящие образцы данных для работы? Вставьте в свой вопрос вывод dput(data_sample)   -  person eipi10    schedule 29.07.2017
comment
@eipi10 eipi10 Я добавил демонстрационный код, написанный создателем пакета ggtree. Я не уверен, что вы имеете в виду под dput(data_sample)   -  person LCM    schedule 29.07.2017


Ответы (1)


Примечание. По состоянию на 14 сентября 2017 г. пакет 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, глава о визуализации Науки о данных с R< /em> (книга с открытым исходным кодом автора 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) 

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

person eipi10    schedule 29.07.2017
comment
Огромное спасибо! Как я могу установить пользовательскую цветовую шкалу и сделать так, чтобы она сохранялась в джойсюлте? У меня есть дерево с бинарными категориями для geom_tippoint(); Я могу выбирать цвета с помощью + scale_colour_manual(values = c("no" = "grey", "yes" = "red3")), но я не могу понять, как сделать так, чтобы эта цветовая схема распространялась на игровой сюжет. Если я использую scale_color_manual(), я получаю сообщение об ошибке Scale for 'color' уже присутствует. Добавление другой шкалы для «цвета», которая заменит существующую шкалу. Но джойсплот сохраняет цвета по умолчанию. - person LCM; 29.07.2017
comment
Добавьте scale_fill_manual(values = c("no" = "grey", "yes" = "red3")) к начальному графику, и он сохранится, когда вы сделаете facet_plot. geom_joy использует эстетику fill, поэтому вам нужно установить цвета заливки с помощью scale_fill_manual, а не scale_colour_manual. Просто используйте одинаковые цвета для colour и fill, и они будут совпадать при построении граней. scales (цветовые шкалы, шкалы форм, диапазоны осей и разрывы и т. д.) — еще один аспект грамматики графики, реализованной в ggplot2. - person eipi10; 29.07.2017
comment
Когда я это делаю, я получаю желаемые цвета (серый и красный) для графика, но не для кончиков деревьев. У меня сейчас нет воспроизводимого примера, но, может быть, вы можете сказать по синтаксису: baseplot <- p %<+% d1 + geom_tippoint(aes(color=factor(HybridizesLax), cex = 1)) + scale_fill_manual(values = c("no" = "grey", "yes" = "red3")) + theme(legend.position = "left") и tree_joyplot <- facet_plot(baseplot, panel="Annual mean temperature (C)", data=amt_data, geom_joy, mapping = aes(x=amt, group=label, fill = factor(HybridizesLax)), colour="grey50", lwd=0.3) - person LCM; 30.07.2017
comment
Смотрите обновление в конце моего ответа. Проблема с кодом в вашем комментарии заключается в том, что оператор scale_colour_manual отсутствует на первом графике, поэтому только эстетика fill в аспекте geom_joy имеет пользовательские цвета, но эстетика colour для точек на древовидном графике по-прежнему использует значения по умолчанию. цвета. - person eipi10; 30.07.2017
comment
Спасибо за обновление с правильным синтаксисом для ggridges! - person LCM; 04.10.2017