ggplot2: Upuść nieużywane współczynniki na wykresie słupkowym z fasetami, ale nie różni się szerokością pasków między płaszczyznami

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")

Jeśli utworzę następujący wykres:

ggplot(df, aes(x=ID, y=VAL, fill=TYPE)) +
  facet_wrap(~ TIME, ncol=1) +
  geom_bar(position="stack") +
  coord_flip()

Zdecydowałem wtedy, że najlepiej byłoby, aby nie pokazywać żadnych czynników, jeśli nie mają żadnych danych. Odniosłem się do różnych pytań i odpowiedzi, które mówiąscale="free" metoda jest drogą (w przeciwieństwie dodrop=TRUE który upuściłby puste aspekty odpowiadające nieużywanym wartościom wTIME), więc następny:

ggplot(df, aes(x=ID, y=VAL, fill=TYPE)) +
  facet_wrap(~TIME, ncol=1, scale="free") +
  geom_bar(position="stack") +
  coord_flip()

Moje pytanie brzmi: jak zapobiec przeskalowaniu pasków, które występują dla aspektu, który ma 4 słupki w stosunku do płaszczyzny z 3 słupkami. Efekt jest subtelny w tym wymyślonym przykładzie, znacznie gorszy w przypadku moich rzeczywistych danych. Idealne wyjście miałoby dolny aspekt z współczynnikami ID 1,4 i 6 na osi pionowej z prętami o tej samej szerokości co górna ścianka, a więc ogólny wymiar pionowy ścianki byłby zmniejszony.

Dodatkowe punkty, jeśli możesz mi pomóc, dlaczego liczby są ułożone zamiast wartości numerycznych (Naprawiono teraz)

Aktualizacja nagród:

Jak wspomniano w mojej kontynuacjipytanie wygląda na to, że lepsze rozwiązanie może wymagać użyciaggplot_build iggplot_table i modyfikowanie obiektu gtable. Jestem pewien, że mógłbym to rozgryźć, ale mam nadzieję, że nagroda może zmotywować kogoś do pomocy. Koshke opublikował kilka przykładówto.

questionAnswers(3)

yourAnswerToTheQuestion