2016-04-14 1 views
3

J'essaie de tracer la distribution des espèces entre 2 types d'habitats différents (hab 1 et hab 2). Certaines de mes espèces utilisent secondairement certains habitats, j'ai donc une colonne séparée pour hab1 secondaire (hab1.sec). Pour visualiser leur distribution à travers les deux habitats et différentes profondeurs, j'utilise un facet_grid entre hab1 et hab2. Exemple de code comme ci-dessous:Ajout de segments de ligne à la grille de facettes existante ggplot r

# example code 
set.seed(101) 
ID <- seq(1,20, by=1) ## ID for plotting 
species <- sample(letters, size=20) ## arbitrary species 

## different habitat types in hab.1 
hab1 <- c("coastal","shelf","slope","open.ocean","seamount") 
hab1.pri <- sample(hab1, size = 20, replace = T) 

## secondarily used habitats, may not be present for some species 
hab.sec <- c("coastal","shelf","slope","open.ocean","seamount", NA) 
hab1.sec <- sample(hab.sec, size = 20, replace = T) 

## habitat types for hab.2 
hab2 <- c("epipelagic","benthopelagic","epibenthic","benthic") 
hab.2 <- sample(hab2, size = 20, replace = T) 

## arbitrary depth values 
dep.min <- sample(seq(0,1000), size = 20, replace = T) 
dep.max <- sample(seq(40, 1500), size = 20, replace = T) 

# make data frame 
dat <- data.frame(ID, species, hab1.pri, hab1.sec, hab.2,dep.min, dep.max) 

# ggplot with facet grid 
p <- ggplot(data=dat)+ geom_segment(aes(x=as.factor(ID),xend=as.factor(ID),y=dep.min, yend=dep.max),size=2,data = dat)+ scale_y_reverse(breaks = c(0, 200, 1000,1500))+facet_grid(hab.2~hab1.pri, scales = "free" ,space = "free")+theme_bw() 

first plot

Je voudrais ajouter des segments pour hab1.sec dans la grille de facette existante. J'ai essayé ce code:

p+ geom_segment(aes(x=as.factor(ID),xend=as.factor(ID),y=dep.min, yend=dep.max),linetype=2,data = dat)+facet_wrap(~hab1.sec) 

Mais cela produit un nouveau graphique.

second plot

Y at-il une meilleure façon d'ajouter ces lignes supplémentaires au réseau existant (de préférence sous forme de lignes en pointillés)? Je serais vraiment reconnaissant pour toute aide avec ceci! Merci beaucoup, d'avance!

+0

L'approche de [cette réponse] (http://stackoverflow.com/a/8354731/2461552) pourrait bien fonctionner ici. – aosmith

+0

merci de répondre @aosmith! vouliez-vous dire 'p + facet_grid (. ~ g, marges = TRUE)' part? Malheureusement, cela n'a pas fonctionné pour moi. – diya

+0

Non, suppression de la deuxième variable de facettage de l'ensemble de données dans le second appel 'geom_segment'. C'était assez facile, mais je ne savais pas à quoi ressemblait votre résultat final, donc je ne savais pas si ça marchait ou non. – aosmith

Répondre

1

Qu'en est-il de combiner les habitats primaires et secondaires en une seule variable et de cartographier cette variable à une esthétique?

Remarque J'utilise les outils tidyr et dplyr ici car ils aident beaucoup dans des cas comme celui-ci.

library(dplyr) 
library(tidyr) 

dat %>% 
    gather(hab1, value, -ID, -species, -(hab.2:dep.max)) %>% 
    ggplot()+ 
    geom_segment(aes(x=as.factor(ID),xend=as.factor(ID),y=dep.min, yend=dep.max, linetype=hab1),size=2) + 
    scale_y_reverse(breaks = c(0, 200, 1000,1500))+ 
    facet_grid(hab.2~value, scales = "free" ,space = "free")+ 
    theme_bw() 
+0

hey @boshek, c'est vraiment super! ouais je voulais combiner les deux ensemble, mais je ne savais pas quel paquet serait le meilleur outil .. essayé d'utiliser 'fondre' de' reshape2' mais je ne pouvais pas comprendre comment le faire fonctionner .. Puis-je juste déranger avec un autre petit détail, s'il vous plait ... serait-il possible de changer 'linetype' selon' hab1' au lieu de 'colour'? Merci beaucoup! – diya

+0

Bien sûr. Changez juste 'colour' en' type de ligne'. Passez du temps avec 'dplyr' et' tidyr'. Cela changera votre vie. – boshek