добавление линейных сегментов к существующей сетке граней ggplot r

Я пытаюсь построить график распределения видов между двумя разными типами среды обитания (жилой дом 1 и жилой дом 2). Некоторые из моих видов вторично используют некоторые среды обитания, поэтому у меня есть отдельный столбец для вторичного hab1 (hab1.sec). Чтобы визуализировать их распределение по двум средам обитания и разным глубинам, я использую facet_grid между hab1 и hab2. Пример кода, как показано ниже:

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

первый сюжет

Я хотел бы добавить сегменты для hab1.sec в существующую сетку фасетов. Я пробовал этот код:

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)

Но при этом получается новый график.

второй график

Есть ли лучший способ добавить эти дополнительные линии в существующую сетку (предпочтительно в виде пунктирных линий)? Буду очень признателен за любую помощь в этом! Заранее большое спасибо!


person diya    schedule 14.04.2016    source источник
comment
Здесь может хорошо работать подход этого ответа.   -  person aosmith    schedule 14.04.2016
comment
спасибо за ответ @aosmith! вы имели в виду p + facet_grid(.~g, margins=TRUE) часть? к сожалению мне не помогло..   -  person diya    schedule 14.04.2016
comment
Нет, удаление второй переменной фасетирования из набора данных во втором вызове geom_segment. Это было довольно просто, но я не был уверен, как должен выглядеть ваш окончательный результат, поэтому не мог сказать, сработало это или нет.   -  person aosmith    schedule 14.04.2016


Ответы (1)


Как насчет того, чтобы объединить первичную и вторичную среду обитания в одну переменную и сопоставить эту переменную с эстетикой?

Обратите внимание, что здесь я использую инструменты tidyr и dplyr, потому что они очень помогают в подобных случаях.

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()
person boshek    schedule 14.04.2016
comment
эй @boshek, это действительно здорово! да, я хотел объединить их вместе, но я не знал, какой пакет будет лучшим инструментом.. пытался использовать melt из reshape2, но не мог понять, как заставить его работать.. Могу я просто побеспокоить вас еще одним крошечным подробнее, пожалуйста.. можно ли заменить linetype на hab1 вместо colour ? Благодаря тонну! - person diya; 14.04.2016
comment
Конечно. Просто измените colour на linetype. Проведите некоторое время с dplyr и tidyr. Это изменит вашу жизнь. - person boshek; 14.04.2016