Выделить позиции без данных в facet_wrap ggplot - PullRequest
2 голосов
/ 07 октября 2019

При огранке барплотов в ggplot, ось X включает в себя все уровни факторов. Однако не все уровни могут присутствовать в каждой группе. Кроме того, могут присутствовать нулевые значения, поэтому только по одной диаграмме невозможно различить значения по оси x без данных и значения с нулевыми значениями y. Рассмотрим следующий пример:

 library(tidyverse)
 set.seed(43)
 site <- c("A","B","C","D","E") %>% sample(20, replace=T) %>% sort()
 year <- c("2010","2011","2012","2013","2014","2010","2011","2012","2013","2014","2010","2012","2013","2014","2010","2011","2012","2014","2012","2014")
 isZero = rbinom(n = 20, size = 1, prob = 0.40)
 value <- ifelse(isZero==1, 0, rnorm(20,10,3)) %>% round(0)
 df <- data.frame(site,year,value)

ggplot(df, aes(x=year, y=value)) +
  geom_bar(stat="identity") +
  facet_wrap(~site)

Это данные переписи рыбы, где не все участки были выловлены за все годы, но иногда рыба не вылавливалась. Отсюда необходимость проводить различие между двумя ситуациями. Например, в 2010 году на сайте C не было вылова, а в 2011 году он не вылавливался, и читатель не может определить разницу. Я хотел бы добавить что-то вроде «без данных» в график на 2011 год. Может быть, возможно заполнить строки, в которых отсутствуют данные, сгенерировать еще один столбец с нужным текстом, который нужно добавить, и затем включить это через geom_text?

1 Ответ

3 голосов
/ 07 октября 2019

Итак, вот пример предложенного вами метода:

# Tabulate sites vs year, take zero entries
tab <- table(df$site, df$year)
idx <- which(tab == 0, arr.ind = T)

# Build new data.frame
missing <- data.frame(site = rownames(tab)[idx[, "row"]],
                      year = colnames(tab)[idx[, "col"]],
                      value = 1,
                      label = "N.D.") # For 'no data'

ggplot(df, aes(year, value)) +
  geom_col() +
  geom_text(data = missing, aes(label = label)) +
  facet_wrap(~site)

enter image description here

В качестве альтернативы, вы можете также разрешить фасетам опускать неиспользованную ось Xзначения:

ggplot(df, aes(x=year, y=value)) +
  geom_bar(stat="identity") +
  facet_wrap(~site, scales = "free_x")

enter image description here

...