Согласованная ширина для geom_bar в случае отсутствия данных

Есть ли способ установить постоянную ширину для geom_bar() в случае отсутствия данных в примере временных рядов ниже? Я пробовал установить width в aes() без везения. Сравните май ’11 по июнь ’11 ширину баров на графике ниже примера кода.

 colours <- c("#FF0000", "#33CC33", "#CCCCCC", "#FFA500", "#000000" ) iris$Month <- rep(seq(from=as.Date("2011-01-01"), to=as.Date("2011-10-01"), by="month"), 15) colours <- c("#FF0000", "#33CC33", "#CCCCCC", "#FFA500", "#000000" ) iris$Month <- rep(seq(from=as.Date("2011-01-01"), to=as.Date("2011-10-01"), by="month"), 15) d<-aggregate(iris$Sepal.Length, by=list(iris$Month, iris$Species), sum) d$quota<-seq(from=2000, to=60000, by=2000) colnames(d) <- c("Month", "Species", "Sepal.Width", "Quota") d$Sepal.Width<-d$Sepal.Width * 1000 g1 <- ggplot(data=d, aes(x=Month, y=Quota, color="Quota")) + geom_line(size=1) g1 + geom_bar(data=d[c(-1:-5),], aes(x=Month, y=Sepal.Width, width=10, group=Species, fill=Species), stat="identity", position="dodge") + scale_fill_manual(values=colours) 

сюжет

Самый простой способ – дополнить ваш dataset, чтобы каждая комбинация присутствовала, даже если она имеет значение NA . Принимая более простой пример (поскольку у вас много ненужных функций):

 dat <- data.frame(a=rep(LETTERS[1:3],3), b=rep(letters[1:3],each=3), v=1:9)[-2,] ggplot(dat, aes(x=a, y=v, colour=b)) + geom_bar(aes(fill=b), stat="identity", position="dodge") 

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

Это показывает поведение, которое вы пытаетесь избежать: в группе «B» нет группы «a», поэтому полосы более широкие. Дополнение dat котором используется кадр данных со всеми комбинациями a и b :

 dat.all <- rbind(dat, cbind(expand.grid(a=levels(dat$a), b=levels(dat$b)), v=NA)) ggplot(dat.all, aes(x=a, y=v, colour=b)) + geom_bar(aes(fill=b), stat="identity", position="dodge") 

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

У меня была та же проблема, но я искал решение, которое работает с трубой ( %>% ). Использование tidyr::spread и tidyr::gather с tidyverse делает трюк. Я использую те же данные, что и @Brian Diggs, но с именами прописных букв, которые не имеют двойных имен переменных при преобразовании в широкий:

 library(tidyverse) dat <- data.frame(A = rep(LETTERS[1:3], 3), B = rep(letters[1:3], each = 3), V = 1:9)[-2, ] dat %>% spread(key = B, value = V, fill = NA) %>% # turn data to wide, using fill = NA to generate missing values gather(key = B, value = V, -A) %>% # go back to long, with the missings ggplot(aes(x = A, y = V, fill = B)) + geom_col(position = position_dodge()) 

Редактировать:

На самом деле это еще более простое решение этой проблемы в сочетании с трубой. Использовать tidyr::complete дает тот же результат в одной строке:

 dat %>% complete(A, B) %>% ggplot(aes(x = A, y = V, fill = B)) + geom_col(position = position_dodge()) 

Некоторые новые параметры для position_dodge() и новой position_dodge2() , введенные в ggplot2 3.0.0, могут помочь.

Вы можете использовать preserve = "single" в position_dodge() чтобы основывать ширину одного элемента, поэтому ширина всех баров будет одинаковой.

 ggplot(data = d, aes(x = Month, y = Quota, color = "Quota")) + geom_line(size = 1) + geom_col(data = d[c(-1:-5),], aes(y = Sepal.Width, fill = Species), position = position_dodge(preserve = "single") ) + scale_fill_manual(values = colours) 

Использование position_dodge2() изменяет способ центрирования, центрируя каждый набор баров на каждом месте оси x. У него есть встроенное padding , поэтому используйте padding = 0 для удаления.

 ggplot(data = d, aes(x = Month, y = Quota, color = "Quota")) + geom_line(size = 1) + geom_col(data = d[c(-1:-5),], aes(y = Sepal.Width, fill = Species), position = position_dodge2(preserve = "single", padding = 0) ) + scale_fill_manual(values = colours) 

  • Как построить только легенды в ggplot2?
  • Как слить 2 вектора чередующихся индексов?
  • Динамически строить вызов для поиска нескольких столбцов
  • Рассчитать площадь под кривой
  • Как указать / таблицу данных по номерам групп из group_by?
  • простые примеры функции фильтра, рекурсивный вариант
  • Добавление начальных нhive с использованием R
  • Выровнять графики ggplot2 по вертикали
  • Фильтрация нескольких значений в столбце строки в dplyr
  • используя stat_function и facet_wrap вместе в ggplot2 в R
  • Загрузите файл с HTTPS с помощью файла download.file ()
  • Давайте будем гением компьютера.