2017-07-29 52 views
10

Czy można dodać panel radości jako panel do wykresu, który zawiera ggtree, jak pokazano w these examples? Przykłady tablic radości to here.ggjoy facet z ggtree

Zdaję sobie sprawę, że mogłem ręcznie umieścić etykiety gatunków dla radonu w tej samej kolejności, co etykiety wierzchołków drzew, ale szukam automatycznego rozwiązania. Chciałbym automatycznie powiązać wiersze joyplota ze szczytami drzew, podobnie jak dane boxplot są powiązane z etykietami końcówek.

Myślę, że przykłady Guangchuang Yu w powyższy link dostarczyć odpowiednie dane:

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) 

To daje poniższy wykres: demo ggtree plot

Czy to możliwe, aby stworzyć joyplot zamiast boxplot?

Oto kod do szybkiego joyplot demo zestawu danych D4 powyżej:

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

wynik jest: demo joyplot

Jestem nowy ggplot2, ggtree i ggjoy więc jestem całkowicie na strata, jak nawet zacząć to robić.

+0

można podać kilka odpowiednich przykładowe dane pracować? Wklej na swoje pytanie wynik polecenia 'dput (data_sample)' – eipi10

+0

@ eipi10 Dodałem kod demo napisany przez twórcę pakietu ggtree. Nie jestem pewien, co masz na myśli przez 'dput (data_sample)' – LCM

Odpowiedz

11

Uwaga: od 2017-09-14, ggjoy package has been deprecated. Zamiast tego użyj ggridges package. Aby uzyskać poniższy kod do pracy z ggridges, użyj geom_density_ridges zamiast geom_joy.


Wygląda jak można po prostu zastąpić geom_boxplot z geom_joy w 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) 

enter image description here

Jeśli jesteś nowym ggplot2, the visualization chapter of Data Science with R (książkę open source przez autora z ggplot2) powinien być pomocny w nauce podstaw.

ggjoy i ggtree rozszerzają możliwości ggplot2. Kiedy takie rozszerzenia są wykonywane dobrze, "oczywista" rzecz do zrobienia (pod względem zwykłej ggplotowej "gramatyki grafiki") często działa, ponieważ pakiet rozszerzeń jest napisany w sposób, który stara się być wierny bazowemu podejściu ggplot2.

Tutaj, moją pierwszą myślą było, aby po prostu zastąpić geom_joy dla geom_boxplot, który okazał się wykonać zadanie. Każdy geom to tylko inny sposób wizualizacji danych, w tym przypadku wykresu słupkowego względem wykresu gęstości. Ale cała pozostała "struktura" wątku pozostaje taka sama, więc możesz po prostu zmienić geom i uzyskać nowy wykres, który następuje po tej samej kolejności osi, odwzorowywaniu kolorów itp. To będzie bardziej sensowne, gdy uzyskasz pewne doświadczenie z Gramatyka grafiki ggplot2.

Oto nieco odmienne podejście znakowania działki lewej:

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) 

enter image description here

UPDATE: Jest to odpowiedź na Twój komentarz pytaniem, jak uzyskać te same kolory niestandardowe zarówno panele facetów. Oto kod, aby to zrobić na przykładzie danych w pytaniu:

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) 

enter image description here

+0

Dziękuję bardzo! W jaki sposób mogę ustawić niestandardową skalę kolorów i sprawić, by była ona odtwarzana do radości? Mam drzewo z kategoriami binarnymi dla geom_tippoint(); Mogę wybierać kolory za pomocą '+ scale_colour_manual (values ​​= c (" no "=" gray "," yes "=" red3 "))' ale nie mogę wymyślić, jak sprawić, aby ten schemat kolorów rozciągał się do joyplota . Jeśli użyję scale_colour_manual() otrzymuję błąd "Scale for" color "już jest obecny. Dodanie kolejnej skali dla" color ", która zastąpi istniejącą skalę." Ale kiosk zachowuje domyślne kolory. – LCM

+1

Dodaj 'scale_fill_manual (values ​​= c (" no "=" gray "," yes "=" red3 "))) do początkowego wykresu i będzie przebiegać po wykonaniu' facet_plot'. 'geom_joy' używa estetyki' fill', więc musisz ustawić kolory wypełnienia 'scale_fill_manual', zamiast' scale_colour_manual'. Po prostu używaj tych samych kolorów dla "kolorów" i "wypełnienia", a będą one pasować, gdy zostaną narysowane aspekty. "skale" (skale kolorów, skale kształtu, zakresy osi i przerwy itp.) to kolejny aspekt "gramatyki grafiki", którego częścią jest ggplot2. – eipi10

+0

Kiedy to robię, uzyskuję pożądane kolory (szary i czerwony) dla obszaru radości, ale nie dla wierzchołków drzew. W tej chwili nie mam odtwarzalnego przykładu, ale być może możesz powiedzieć ze składni: 'baseplot <- p% <+% d1 + geom_tippoint (aes (color = factor (HybridizesLax), cex = 1)) + scale_fill_manual (values ​​= c ("no" = "gray", "yes" = "red3")) + theme (legend.position = "left") 'and' tree_joyplot <- facet_plot (baseplot, panel = "Średnia temperatura roczna (C) ", data = amt_data, geom_joy, mapowanie = aes (x = amt, grupa = etykieta, wypełnienie = czynnik (HybridizesLax)), kolor =" grey50 ", lwd = 0.3)' – LCM