Генерировать парные столбчатые гистограммы в ggplot (используя position dodge только для некоторых переменных)

Я надеюсь использовать ggplot2 чтобы создать набор штабелированных баров в парах, примерно так:

stacked bar chars example

со следующими данными примера:

df <- expand.grid(name = c("oak","birch","cedar"),
        sample = c("one","two"),
        type = c("sapling","adult","dead"))
df$count <- sample(5:200, size = nrow(df), replace = T)

Я хотел бы, чтобы ось x представляла имя дерева с двумя барами на вид дерева: один бар для образца один и один бар для образца два. Затем цвета каждого бара должны быть определены по типу.

следующий код генерирует сложенную панель с цветами по тип:

ggplot(df, aes(x = name, y = count, fill = type)) + geom_bar(stat = "identity")

enter image description here

и следующий код генерирует уклоненные бары по образцу:

ggplot(df, aes(x = name, y = count, group = sample)) + geom_bar(stat = "identity", position = "dodge")

enter image description here

но я не могу заставить его уклониться от одной из групп (образец) и сложить другую группу (тип):

ggplot(df, aes(x = name, y = count, fill = type, group = sample)) + geom_bar(stat = "identity", position = "dodge")

enter image description here

1 ответов


одним обходным путем было бы поставить взаимодействие sample и name на оси x, а затем отрегулируйте метки для оси X. Проблема в том, что бары не расположены близко друг к другу.

ggplot(df, aes(x = as.numeric(interaction(sample,name)), y = count, fill = type)) + 
  geom_bar(stat = "identity",color="white") +
  scale_x_continuous(breaks=c(1.5,3.5,5.5),labels=c("oak","birch","cedar"))

enter image description here

другое решение-использовать фасеты для name и sample Как значения x.

ggplot(df,aes(x=sample,y=count,fill=type))+
  geom_bar(stat = "identity",color="white")+
  facet_wrap(~name,nrow=1)

enter image description here