varias superponer ordenar grafico graficas graficar ggplot barras r ggplot2 r-faq

superponer - Ordenar barras en ggplot2 gráfico de barras



superponer graficas en r ggplot (10)

Estoy tratando de hacer un gráfico de barras donde la barra más grande sería la más cercana al eje y y la barra más corta sería la más alejada Así que esto es algo así como la tabla que tengo

Name Position 1 James Goalkeeper 2 Frank Goalkeeper 3 Jean Defense 4 Steve Defense 5 John Defense 6 Tim Striker

Así que estoy tratando de construir una gráfica de barras que muestre el número de jugadores según la posición

p <- ggplot(theTable, aes(x = Position)) + geom_bar(binwidth = 1)

pero la gráfica muestra primero la barra del portero, luego la defensa, y finalmente la del delantero. Me gustaría que la gráfica se ordenara de modo que la barra de defensa esté más cerca del eje y, el del portero y, por último, el delantero. Gracias


@GavinSimpson: reorder es una solución poderosa y efectiva para esto:

ggplot(theTable, aes(x=reorder(Position,Position, function(x)-length(x)))) + geom_bar()


Además de forcats :: fct_infreq, mencionado por @HolgerBrandl, hay forcats :: fct_rev, que invierte el orden de los factores.

theTable <- data.frame( Position= c("Zoalkeeper", "Zoalkeeper", "Defense", "Defense", "Defense", "Striker"), Name=c("James", "Frank","Jean", "Steve","John", "Tim")) p1 <- ggplot(theTable, aes(x = Position)) + geom_bar() p2 <- ggplot(theTable, aes(x = fct_infreq(Position))) + geom_bar() p3 <- ggplot(theTable, aes(x = fct_rev(fct_infreq(Position)))) + geom_bar() gridExtra::grid.arrange(p1, p2, p3, nrow=3)


Como reorder() en la respuesta de Alex Brown, también podríamos usar forcats::fct_reorder() . Básicamente, ordenará los factores especificados en el primer argumento, de acuerdo con los valores del segundo argumento después de aplicar una función específica (por defecto = mediana, que es lo que usamos aquí, ya que solo tenemos un valor por nivel de factor).

Es una pena que, en la pregunta del OP, el orden requerido también sea alfabético, ya que ese es el orden predeterminado cuando se crean factores, por lo que ocultará lo que realmente está haciendo esta función. Para que quede más claro, reemplazaré "Portero" por "Zoalkeeper".

library(tidyverse) library(forcats) theTable <- data.frame( Name = c(''James'', ''Frank'', ''Jean'', ''Steve'', ''John'', ''Tim''), Position = c(''Zoalkeeper'', ''Zoalkeeper'', ''Defense'', ''Defense'', ''Defense'', ''Striker'')) theTable %>% count(Position) %>% mutate(Position = fct_reorder(Position, n, .desc = TRUE)) %>% ggplot(aes(x = Position, y = n)) + geom_bar(stat = ''identity'')


Creo que las soluciones ya proporcionadas son demasiado verbosas. Una forma más concisa de hacer una gráfica de barras ordenada por frecuencia con ggplot es

ggplot(theTable, aes(x=reorder(Position, -table(Position)[Position]))) + geom_bar()

Es similar a lo que Alex Brown sugirió, pero un poco más corto y funciona sin una definición de función anónima.

Actualizar

Creo que mi solución anterior era buena en ese momento, pero hoy en día prefiero usar forcats::fct_infreq que es la clasificación de los niveles de factores por frecuencia:

require(forcats) ggplot(theTable, aes(fct_infreq(Position))) + geom_bar()


Estoy de acuerdo con Zach en que contar con dplyr es la mejor solución. He encontrado que esta es la versión más corta:

dplyr::count(theTable, Position) %>% arrange(-n) %>% mutate(Position = factor(Position, Position)) %>% ggplot(aes(x=Position, y=n)) + geom_bar(stat="identity")

Esto también será significativamente más rápido que reordenar los niveles de factor de antemano, ya que el recuento se realiza en dplyr, no en ggplot o utilizando la table .


La clave con el orden es establecer los niveles del factor en el orden que desee. No se requiere un factor ordenado; la información adicional en un factor ordenado no es necesaria y si estos datos se utilizan en cualquier modelo estadístico, podría producirse una parametrización incorrecta; los contrastes polinomiales no son los adecuados para datos nominales como este.

## set the levels in order we want theTable <- within(theTable, Position <- factor(Position, levels=names(sort(table(Position), decreasing=TRUE)))) ## plot ggplot(theTable,aes(x=Position))+geom_bar(binwidth=1)

En el sentido más general, simplemente necesitamos establecer los niveles de factor para que estén en el orden deseado. Si no se especifica, los niveles de un factor se ordenarán alfabéticamente. Sin embargo, hay varias formas de cambiar el orden a una secuencia específica dependiendo de la situación. Por ejemplo, podríamos hacer:

levels(theTable$Position) <- c(...)

y simplemente liste los niveles en el orden deseado en el lado derecho. También puede especificar el orden de nivel dentro de la llamada a factor como anteriormente:

theTable$Position <- factor(theTable$Position, levels = c(...))


Si las columnas del gráfico provienen de una variable numérica como en el marco de datos a continuación, puede usar una solución más simple:

ggplot(df, aes(x = reorder(Colors, -Qty, sum), y = Qty)) + geom_bar(stat = "identity")

El signo menos antes de la variable de ordenación (-Qty) controla la dirección de ordenación (ascendente / descendente)

Aquí hay algunos datos para la prueba:

df <- data.frame(Colors = c("Green","Yellow","Blue","Red","Yellow","Blue"), Qty = c(7,4,5,1,3,6) ) **Sample data:** Colors Qty 1 Green 7 2 Yellow 4 3 Blue 5 4 Red 1 5 Yellow 3 6 Blue 6

Cuando encontré este hilo, esa fue la respuesta que estaba buscando. Espero que sea útil para los demás.


Solo necesita especificar la columna Position para que sea un factor ordenado donde los niveles están ordenados por sus conteos:

theTable <- transform( theTable, Position = ordered(Position, levels = names( sort(-table(Position)))))

(Tenga en cuenta que la table(Position) produce un recuento de frecuencia de la columna Position ).

Luego, su función ggplot mostrará las barras en orden decreciente decreciente. No sé si hay una opción en geom_bar para hacer esto sin tener que crear explícitamente un factor ordenado.


Un simple reordenamiento de factores basado en dplyr puede resolver este problema:

library(dplyr) #reorder the table and reset the factor to that ordering theTable %>% group_by(Position) %>% # calculate the counts summarize(counts = n()) %>% arrange(-counts) %>% # sort by counts mutate(Position = factor(Position, Position)) %>% # reset factor ggplot(aes(x=Position, y=counts)) + # plot geom_bar(stat="identity") # plot histogram


Utilizando scale_x_discrete (limits = ...) para especificar el orden de las barras.

positions <- c("Goalkeeper", "Defense", "Striker") p <- ggplot(theTable, aes(x = Position)) + scale_x_discrete(limits = positions)