ggplot2: Löschen Sie nicht verwendete Faktoren in einem facettierten Balkendiagramm, jedoch ohne unterschiedliche Balkenbreiten zwischen den Facetten

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

Wenn ich den folgenden Plot erstelle:

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

Ich entscheide mich dann, im Idealfall zu unterdrücken, dass Faktoren in einer Facette angezeigt werden, in der sie keine Daten enthalten. Ich habe auf verschiedene Fragen und Antworten verwiesen, die das besagenscale="free" Methode ist der Weg zu gehen (im Gegensatz zudrop=TRUE Das würde leere Facetten löschen, die nicht verwendeten Werten in entsprechenTIME), also weiter:

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

Meine Frage ist, wie die Neuskalierung der Balken verhindert werden kann, die für die Facette mit 4 Balken gegenüber der Facette mit 3 Balken auftritt. Der Effekt ist in diesem erfundenen Beispiel subtil, viel schlimmer bei meinen tatsächlichen Daten. Die ideale Ausgabe hätte die untere Facette mit den ID-Faktoren 1,4 und 6 auf der vertikalen Achse mit Balken, die die gleiche Breite wie die obere Facette haben, und daher würde die vertikale Gesamtabmessung der Facette verringert.

Bonuspunkte, wenn Sie mir helfen können, warum die Zählungen anstelle der numerischen Werte gestapelt werden (jetzt behoben)

Bounty-Update:

Wie in meinem Follow-up erwähntFrage Es sieht so aus, als ob eine bessere Lösung die Verwendung von beinhalten könnteggplot_build undggplot_table und Ändern des gtable-Objekts. Ich bin mir ziemlich sicher, dass ich es mit der Zeit herausfinden könnte, aber ich hoffe, dass ein Kopfgeld jemand anderen motiviert, mir zu helfen. Koshke hat einige Beispiele gepostetdiese.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage