2015-11-02 3 views
2

Я использую ggplot (v1.0.1) для построения гистограмм с заполнением штрихов, преобразованных в двоичный коэффициент State, и используя position = "dodge". Гистограммы фасетятся вторым фактором Group. Когда один уровень фактора State отсутствует в группе, график для этого аспекта отличается от графика, в котором присутствуют оба уровня. Следующий пример иллюстрирует это игрушка:Предотвращение падения уровня фактора в гистограммы ggplot с фасеткой

set.seed(1234) 
states <- c("Alive", "Dead") 
dat <- data.frame(Group = rep(LETTERS[1:2], each=100), 
       Measure = rnorm(200, 50, 10), 
       State = c(rep(states, 50), rep("Alive", 100))) 

ggplot() + 
    geom_histogram(data=dat, aes(x=Measure, fill=State), 
       position="dodge", binwidth=5) + 
    facet_wrap(~ Group) 

default behaviour with level dropped from facet B

То, что я хотел бы для баров в фаской для группы B имеют одинаковую ширину и относительное положение, как те, для группы А. Я думал facet_wrap(~ Group, drop = FALSE) выполнит это, но это, похоже, не имеет никакого эффекта. Следующая работа вокруг достигает желаемый участок:

dat <- rbind(dat, data.frame(Group="B", Measure=50, State=NA)) 
ggplot() + 
    geom_histogram(data=dat, aes(x=Measure, fill=State), 
       position="dodge", binwidth=5) + 
    scale_fill_discrete(na.value = NA) + 
    facet_wrap(~ Group) 

work-around to give same bin width and position in facets

Но я уверен, что я должен быть отсутствующим вариантом ggplot, что бы выполнить это без необходимости взламывать данные.

+1

'ggplot', как правило, очень хорош при построении данных в вашем фрейме данных, я не уверен, что я подумал бы о том, чтобы сделать ваш фрейм данных более подходящим для того, что вы хотите построить« взломать данные ». 'tidyr' имеет функцию' complete() 'только для такого преобразования. – Gregor

+0

В строгом смысле, ваш сюжет не является гистограммой. Вместо использования 'position_dodge', я бы использовал прозрачность« alpha »или другое измерение огранки. – Roland

+0

@Gregor спасибо за отзыв о функции tidyr – michael

ответ

4

Короткий ответ NO; к сожалению, нет опции ggplot, которая может достичь этого для вас. Существует несколько обходных решений.

первый и, возможно, самый простой вариант, который вы уже нашли, добавив NA.

second вариант - это вручную отрегулировать ширину стержней, как в первом ответе на вопрос this.

третий вариант взят из предложения @Roland: не "додж", но использовать прозрачность:

ggplot() + 
    geom_histogram(data=dat, aes(x=Measure, fill=State), 
       position=position_identity(), binwidth=5, alpha=0.5) + 
    facet_wrap(~ Group) + 
    #change the colors and background, to improve visibility 
    scale_fill_manual(values=c("red","blue")) + 
    theme(panel.background = element_rect(fill = "transparent",colour = "black")) 

даст вам этот график:

ggplot histogram with transparency

Лично Я нахожу это отвратительным.

+0

Большое спасибо. Альфа-вариант не понравился мне. – michael

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