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")
Si creo la figura siguiente:ggplot2: Caída de los factores utilizados en un diagrama de barras facetas pero no tienen diferentes anchos de las barras entre las facetas
ggplot(df, aes(x=ID, y=VAL, fill=TYPE)) +
facet_wrap(~ TIME, ncol=1) +
geom_bar(position="stack") +
coord_flip()
que luego decido que lo ideal sería como para suprimir cualquier factor que se muestra en una faceta donde no tienen ningún dato. Me he referido varias preguntas y respuestas que dicen que el método scale="free"
es el camino a seguir (en contraposición a drop=TRUE
cual se reduciría facetas vacíos correspondientes a valores no utilizados en TIME
), así que la próxima:
ggplot(df, aes(x=ID, y=VAL, fill=TYPE)) +
facet_wrap(~TIME, ncol=1, scale="free") +
geom_bar(position="stack") +
coord_flip()
Mi pregunta es cómo evitar el cambio de escala de las barras que se produce para la faceta que tiene 4 barras frente a la faceta con 3 barras. El efecto es sutil en este ejemplo artificial, mucho peor con mis datos reales. La salida ideal tendría la faceta inferior con los factores ID 1,4, y 6 en el eje vertical con barras que tienen el mismo ancho que la faceta superior, y así se reduciría la dimensión vertical general de la faceta.
puntos de bonificación si usted me puede ayudar con eso los recuentos se apilan en lugar de los valores numéricos (fijar ahora)
actualización Recompensa:
Como se mencionó en mi seguimiento question se ve como una solución mejor podría implicar el uso de ggplot_build
y ggplot_table
y modificar el objeto tablable. Estoy bastante seguro de que podría resolverlo con el tiempo, pero espero que una recompensa motive a otra persona para que me ayude. Koshke ha publicado algunos ejemplos de this.
Para el punto de bonificación: tal vez una minúscula 'y' en lugar de' y', junto con 'stat = "identidad"'? – joran
¡Gracias! Sin embargo, la identidad arg no era necesaria. –
también existe el argumento 'space = 'free'' para' facet_wrap' que podría ser lo que estás buscando. Hubo una pregunta perfecta con respecto a esto antes, pero el usuario lo borró ... – Justin