Как применить ggplot position_dodge к категориям без данных?
Я пытаюсь использовать position_dodge на ggplot для получения коробочных диаграмм двух разных сигналов (ind), разделяющих одни и те же категории (cat). Когда есть категория с данными для одного сигнала, но не для другого, блокпост для сигнала с данными охватывает весь горизонтальный интервал и не учитывает инструкцию position_dodge для этой конкретной категории. Есть ли способ заставить ggplot применять правило уклонения? Как видно из приведенного ниже примера, сигнал x не имеет данных для категории B, поэтому он теряет место, зарезервированное для position_dodge. Я хотел бы избежать этого.
Заранее спасибо.
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))
После некоторых обходных путей я нашел результат, который искал ... (вроде)
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)
Некоторые люди рекомендуют использовать огранку для желаемого эффекта. Faceting не дает мне эффекта, который я ищу. Окончательный график, который я искал, показан ниже:
Если вы заметили, белая большая отметка у = 10 толще других отметок. Эта более толстая линия - geom_line с размером = 1, которая скрывает нежелательные поля.
Я хотел бы, чтобы мы могли объединять различные объекты geom более плавно. Я сообщил об этом как об ошибке на github Хэдли, но Хэдли сказал, что именно так position_dodge ведет себя конструктивно. Я предполагаю, что я использую ggplot2 нестандартным способом, и обходные пути - способ решить эти проблемы. В любом случае, я надеюсь, что это поможет некоторым из R продвинуть отличную функциональность ggplot немного дальше.