Измените порядок наложенных полос на графике, чтобы более длинные полосы находились сзади -R - PullRequest
1 голос
/ 29 мая 2020

У меня есть штриховая диаграмма, которую я хочу наложить. Проблема в том, что более длинные полосы перекрывают более короткие. В Excel есть функция, которая позволяет отодвигать более длинные стержни назад, а более короткие стержни - на передний план. Как я могу сделать это в R?

Мой код ниже:

ggplot(df2) +geom_bar(aes(x = id, y = `Feb-20`), position = "identity",stat="identity", fill = 'green') +
  geom_bar(aes(x = id, y = `Mar-20`), position = "identity", stat="identity",fill = 'navy') +
  geom_bar(aes(x = id, y = `Apr-20`), position = "identity", stat="identity", fill = 'red') 

И создает эту диаграмму:

enter image description here

Теперь я видел некоторые решения этой проблемы путем изменения прозрачности. Поскольку у меня есть три фактора, изменение альфа-канала было не очень ясным:

enter image description here

Как я могу изменить порядок наложения полосок, чтобы дольше решетки сзади?

1 Ответ

1 голос
/ 29 мая 2020

Я бы порекомендовал вам переключиться на geom_col, если вы собираетесь строить столбцы, но с эстетикой x= и y=. См. Здесь объяснение документации . С учетом сказанного, это будет работать в любом случае. В основном:

  • Tidy Data : я не могу подтвердить, но кажется, что ваш набор данных df2 не организован в соответствии с Принципами Tidy Data , что значительно упрощает работу с ggplot2 и многими другими методами анализа данных. Вместо того, чтобы разделять ваши значения y между df2$Mar-20 и df2$Apr-20, у вас должен быть столбец для категории (назовем его df2$date) и столбец для фактического значения df2$y. Затем вам нужно будет один раз позвонить по номеру geom_bar и сообщить aes(x=id, y=y). Вы можете сделать это через dplyr::gather() или melt из пакета reshape2.

  • Упорядочить данные: Вне любого другого влияния (например, упорядочение уровней фактора), функция построения графика в ggplot2 построит данные в соответствии с расположением фактического фрейма данных для x= и y= aestheti c. Это означает, что если вы заранее упорядочиваете данные по определенному, нефакторному значению, это будет определять порядок, в котором будет отображаться ggplot2. Таким образом, вы должны упорядочить график по убыванию df2$y перед построением, чтобы самые большие столбцы были нанесены первыми, а самые маленькие - последними, что означает, что самые маленькие будут впереди.

Вот полный пример с фиктивными данными:

library(ggplot2)
library(dplyr)

set.seed(1234)
df <- data.frame(
  x=rep(LETTERS[1:10],3),
  y=sample(1:100,30,replace=TRUE),
  id=c(rep('Group1',10),rep('Group2',10),rep('Group3',10))
)

df %>%
arrange(-y) %>%
ggplot(aes(x,y)) + theme_bw() +
  geom_bar(aes(fill=id),stat='identity',position=position_identity())

enter image description here

Попробуйте эту функцию ggplot() без функции arrange(), и вы увидите, что эффект что вы собираетесь делать.

...