df <- structure(list(ID = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 6L, 7L, 7L, 7L),.Label = c("1", "2", "3", "4", "5", "6", "7"), class = "factor"), TYPE = structure(c(1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 6L, 1L, 2L, 3L, 4L, 5L, 6L, 1L, 2L, 3L, 4L, 5L, 6L, 1L, 2L, 3L, 4L, 5L, 6L, 1L, 2L, 3L, 4L, 5L, 6L, 1L, 2L, 3L),.Label = c("1", "2", "3", "4", "5", "6", "7", "8"), class = "factor"), TIME = structure(c(2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L),.Label = c("1", "5", "15"), class = "factor"), VAL = c(0.937377670081332, 0.522220720537007, 0.278690102742985, 0.967633064137772, 0.116124767344445, 0.0544306698720902, 0.470229141646996, 0.62017166428268, 0.195459847105667, 0.732876230962574, 0.996336271753535, 0.983087373664603, 0.666449476964772, 0.291554537601769, 0.167933790013194, 0.860138458199799, 0.172361251665279, 0.833266809117049, 0.620465772924945, 0.786503327777609, 0.761877260869369, 0.425386636285111, 0.612077651312575, 0.178726130630821, 0.528709076810628, 0.492527724476531, 0.472576208412647, 0.0702785139437765, 0.696220921119675, 0.230852259788662, 0.359884874196723, 0.518227979075164, 0.259466265095398, 0.149970305617899, 0.00682218233123422, 0.463400925742462, 0.924704828299582, 0.229068386601284)),.Names = c("ID", "TYPE", "TIME", "VAL"), row.names = c(NA, -38L), class = "data.frame")
Если я создам следующий график:
ggplot(df, aes(x=ID, y=VAL, fill=TYPE)) + facet_wrap(~ TIME, ncol=1) + geom_bar(position="stack") + coord_flip()
Затем я решаю, что в идеале хотел бы подавить отображение каких-либо факторов в аспекте, где у них нет никаких данных. Я ссылался на различные вопросы и ответы, в которых говорится, что метод
scale="free"
— это путь (, в отличие отdrop=TRUE
, который отбрасывает пустые аспекты, соответствующие неиспользуемым значениям вTIME
)., поэтому далее:ggplot(df, aes(x=ID, y=VAL, fill=TYPE)) + facet_wrap(~TIME, ncol=1, scale="free") + geom_bar(position="stack") + coord_flip()
Мой вопрос заключается в том, как предотвратить изменение масштаба баров, которое происходит для фасета с 4 барами по сравнению с фасетом с 3 барами. В этом надуманном примере эффект едва уловим, гораздо хуже с моими реальными данными. Идеальный результат будет иметь нижнюю грань с ID-факторами 1, 4 и 6 на вертикальной оси с полосами, имеющими ту же ширину, что и верхняя грань, и, таким образом, общий вертикальный размер грани будет уменьшен.
Бонусные баллы, если вы можете помочь мне понять, почему счетчики складываются, а не числовые значения (Теперь исправлено)
Обновление наград:
Как упоминалось в моем последующем вопросе , похоже, что лучшее решение может включать использование
ggplot_build
иggplot_table
и изменение объекта gtable. Я почти уверен, что смогу понять это со временем, но я надеюсь, что награда может мотивировать кого-то еще помочь мне. Кошке опубликовал несколько примеров этого .