Como impor o position_dodge de ggplot em categorias sem dados?
Eu estou tentando usar position_dodge no ggplot para obter boxplots de dois sinais diferentes (ind) compartilhando as mesmas categorias (cat). Quando há uma categoria com dados para um sinal, mas não para o outro, o boxplot para o sinal com dados cobre todo o espaçamento horizontal e não respeita a instrução position_dodge para aquela categoria em particular. Existe uma maneira de fazer ggplot para impor a regra de esquiva? Como você pode ver no exemplo abaixo, o sinal x não tem dados para a categoria B, então perde o espaço reservado por position_dodge. Eu gostaria de evitar isso.
Desde já, obrigado.
data<-data.frame(cat=c('A','A','A','A','B','B','A','A','A','A','B','B'),
values=c(3,2,1,4,NA,NA,4,5,6,7,8,9),
ind=c('x','x','x','x','x','x','y','y','y','y','y','y'))
print(ggplot() +
scale_colour_hue(guide='none') +
geom_boxplot(
aes(x=as.factor(cat), y=values,
fill=ind),
position=position_dodge(width=.60),
data=data,
outlier.size = 1.2,
na.rm=T))
ATUALIZAÇÃO DO PROGRESSODepois de algumas soluções, eu tive o resultado que eu estava procurando ... (meio que)
data <- data.frame(
cat=c('A','A','A','A','B','B','A','A','A','A','B','B','B'),
values=c(3,2,1,4,NA,NA,4,5,6,7,8,9, 0),
ind=c('x','x','x','x','x','x','y','y','y','y','y','y','x'))
p <- ggplot() +
scale_colour_hue(guide='none') +
geom_boxplot(aes(x=as.factor(cat), y=values, fill=ind),
position=position_dodge(width=.60),
data=data,
outlier.size = 1.2,
na.rm=T) +
geom_line(aes(x=x, y=y),
data=data.frame(x=c(0,3),y=rep(0,2)),
size = 1,
col='white')
print(p)
Algumas pessoas recomendaram o uso de lapidação para o efeito que eu queria. Faceting não me dá o efeito que estou procurando. O gráfico final que eu estava procurando é mostrado abaixo:
Se você notar, a marca de escala branca maior em y = 10 é mais espessa do que as outras marcas de escala. Essa linha mais espessa é a geom_line com size = 1, que oculta os boxplots indesejados.
Eu gostaria que pudéssemos combinar diferentes objetos geométricos mais facilmente. Eu relatei isso como um bug no github de Hadley, mas Hadley disse que é assim que o position_dodge se comporta pelo design. Eu acho que estou usando o ggplot2 de uma maneira não padronizada e as soluções alternativas são o caminho a seguir nesses tipos de problemas. De qualquer forma, espero que isso ajude alguns dos Rs a empurrar um pouco mais a grande funcionalidade do ggplot.