2014-01-20 3 views
2

у меня есть проблемы, заполняющие бары в то время как группировка с facet_wrap Используя этот data.frame:ggplot2 с заливкой и группой

library(ggplot2) 
library(gridExtra) 
set.seed(1234) 
testDat <- data.frame(answer=factor(sample(c("yes", "no"), 60, replace=TRUE)), 
         which=factor(sample(c("q1", "q2", "q3"), 60, replace=TRUE))) 

Я хотел построить ответ, сгруппированные по приводимой переменной. Это дает мне абсолютные значения:

ggplot(testDat, aes(x=answer)) + 
    geom_bar(aes(fill=answer)) + facet_wrap(~which) 

Это дает мне относительные значения. Но не для группы:

ggplot(testDat, aes(x=answer)) + 
    geom_bar(aes(y=(..count..)/sum(..count..), fill=answer)) + facet_wrap(~which) 

Поиск ответа Я обнаружил это для определения относительных значений для каждой группы. Но цвет заливки больше не работает

ggplot(testDat, aes(x=answer)) + 
    geom_bar(aes(y=(..count..)/sum(..count..), group=which, fill=answer)) + facet_wrap(~which) 

Он просто работает для трех различных значений «которые», а не «ответ»

ggplot(testDat, aes(x=answer)) + 
    geom_bar(aes(y=(..count..)/sum(..count..), group=which, fill=which)) + facet_wrap(~which) 

Любые предложения о том, как заполнить бары?

p1<-ggplot(testDat, aes(x=answer)) + geom_bar(aes(y=(..count..)/sum(..count..), group=which, fill=answer)) + facet_wrap(~which) 
p2<-ggplot(testDat, aes(x=answer)) + geom_bar(aes(y=(..count..)/sum(..count..), group=which, fill=which)) + facet_wrap(~which) 
grid.arrange(p1,p2) 

ответ

3

Это вы имели в виду?

library(reshape2) 
library(ggplot2) 
df <- aggregate(answer~which,testDat, 
       function(x)c(yes=sum(x=="yes")/length(x),no=sum(x=="no")/length(x))) 
df <- data.frame(which=df$which, df$answer) 
gg <- melt(df,id=1, variable.name="Answer",value.name="Rel.Pct.") 
ggplot(gg) + 
    geom_bar(aes(x=Answer, y=Rel.Pct., fill=Answer),position="dodge",stat="identity")+ 
    facet_wrap(~which) 

К сожалению, агрегирование функции, такие, как sum(...), min(...), max(...), range(...) и т.д. и т.п., при использовании в эстетических отображений, не соблюдают группировку подразумеваемых граней. Таким образом, в то время как ..count.. подмножественно правильно, когда используется один (в вашем числителе), sum(..count..) дает общее количество для всего набора данных. Вот почему (..count..)/sum(..count..) дает долю всего, а не долю группы.

Единственный способ, которым я знаю, - создать подмышечный стол, как указано выше.

+0

Спасибо за пояснения относительно использования агрегирования функций. Я нашел путь вокруг '..count ../ sum (.. count ..)' с '..density ..)'. Мой вопрос по-прежнему остается за тем, почему 'fill = which' работает, а' fill = answer' - нет. – schlusie

+0

Соответствие подмножества функций для групп, определенных в эстетических отображениях (например, в вызове 'aes (...)'). Они не работают для групп, определенных неявно в грани. Поэтому, если у вас есть 'aes (..., fill = which)', а также 'facet__wrap (~ which)', вы определяете группы в обоих местах, и это сработает. Но это совершенно другой сюжет. – jlhoward

3

Существует способ объединения с использованием ggplot в соответствии с запросом mentioned in this question. Однако для этого требуется использование PANEL variable that isn't documented therefore Hadley recomended not to use it.

Ниже приведен способ объединения, используя data.table. Я также добавил процентные метки к сюжету.

grp <- function(x) { 
    percentage = as.numeric(table(x)/length(x)) 
    list(x = levels(x), 
     percentage = percentage, 
     label = paste0(round(as.numeric(table(x)/length(x), 0) * 100), "%") 
) 
} 

require("data.table") 
DT <- data.table(testDat) 

# Simpler version 
ggplot(DT[, grp(answer), by=which]) + 
    geom_bar(aes(x=x, y=percentage, fill = x), position="dodge",stat="identity") + 
    facet_grid(~which) + 
    xlab("Answer") 

# With percentage labels and y axis with percentage 
ggplot(DT[, grp(answer), by=which]) + 
    geom_bar(aes(x=x, y=percentage, fill = x), position="dodge",stat="identity") + 
    geom_text(aes(x=x, ymax = 0.6, y=percentage, label = label), vjust = -1.2, color = "grey20") + 
    facet_grid(~which) + 
    xlab("Answer") + xlim("yes", "no") + 
    scale_y_continuous(labels = percent_format()) + 
    scale_fill_discrete(name = "Answer") 

enter image description here

Смежные вопросы