7 votos

Un terreno de barras apiladas

Tengo un marco de datos cuya primera columna es el nombre de un elemento y la segunda es la frecuencia de ese elemento en el conjunto de datos.

 names            freq
1 tomato           7
2 potato           4
3 cabbage          5
4 sukuma-wiki      8
5 terere           20

Me gustaría tener una columna de barras apiladas que represente la proporción de cada entrada en el gráfico. ¿Cómo se maneja el color de la barra apilada cuando se presenta con más de sesenta entradas? ¿Cuál es la forma más fácil de hacer esto?

0 votos

Sería útil añadir una ayuda visual al debate.

13voto

Mohit Jain Puntos 412

Con 60 categorías distintas, me parece que puede ser difícil que sea un gráfico eficaz. Puede considerar un gráfico de barras normal ordenado de forma ascendente o descendente. Si son recuentos o porcentajes, depende de usted. Tal vez algo como esto:

library(ggplot2)
df$names <- reorder(df$names, -df$freq) #Reorders into ascending order
qplot(x = names, y = freq, data = df, geom = "bar") + coord_flip()

EDITAR:

Para hacer un gráfico de barras apiladas con ggplot , fijamos el x = 1 ya que sólo tendremos una columna. Utilizaremos el fill para añadir color:

qplot(x = factor(1), y = freq, data = df, geom = "bar", fill = names) 

También es interesante: un gráfico de barras apiladas está muy cerca de ser un gráfico circular. Puede transformar el sistema de coordenadas de los gráficos ggplot con + coord_polar(theta = "y") para hacer un gráfico circular a partir del gráfico de barras apiladas anterior.

0 votos

+1 para el uso de qplot() pero quizás sería interesante mostrar también el otro camino (apilado) y el uso del color.

7voto

DavLink Puntos 101

Dudo que se pueda encontrar una gama adecuada de colores distintos con tantas categorías. De todos modos, aquí hay algunas ideas:

  1. Para el gráfico de barras apilado, necesita barplot() con beside=FALSE (que es el predeterminado) -- esto es en R base (la solución de @Chase con ggplot2 también es bueno)
  2. Para generar una rampa de color, puede utilizar la función RColorBrewer el ejemplo mostrado por @fRed puede ser reproducido con brewer.pal y cualquiera de las paletas divergentes o secuenciales. Sin embargo, el número de colores es limitado, por lo que tendrás que reciclarlos (por ejemplo, cada 6 elementos)

He aquí una ilustración:

library(RColorBrewer)
x <- sample(LETTERS[1:20], 100, replace=TRUE)
tab <- as.matrix(table(x))
my.col <- brewer.pal(6, "BrBG") # or brewer.pal(6, "Blues")
barplot(tab, col=my.col)

También existe la espacio de color que tiene una bonita viñeta de acompañamiento sobre el diseño de buenos esquemas de color. Consulte también el curso de Ross Ihaka sobre Tema de análisis de datos y gráficos computacionales .

Ahora, una mejor manera de mostrar estos datos es probablemente utilizar el llamado gráfico de puntos de Cleveland, es decir

dotchart(tab)

0 votos

La trama de Cleveland, por supuesto.

2 votos

Parece que siempre me olvido de los gráficos de puntos, aunque en todas partes Tufte habla de su relación superior entre datos y tinta... Creo que esta sugerencia, combinada con la reordenación de los datos, da lugar a un gráfico informativo y fácil de digerir. Para completar, para cambiar de barras a puntos en ggplot2 simplemente necesita el geom = "point" : qplot(x = names, y = freq, data = df, geom = "point") + coord_flip()

0 votos

@Chase Gracias por esto (también he apreciado que hayas actualizado rápidamente tu respuesta tras mi comentario). La reordenación tendría sentido si no hay una agrupación natural entre los ítems (lo que suele ocurrir en los cuestionarios estructurados), pero yo también la utilizo porque es muy conveniente para mostrar posibles efectos de techo o suelo. Ahora bien, la cuestión es que un gráfico de barras apilado rara vez transmite información eficaz sobre los ítems binarios (parece más apropiado para las categorías de respuesta ordenadas, como los ítems de tipo Likert), mientras que el gráfico de puntos puede hacer frente a ambos tipos de ítems. En este caso, el factor limitante es el número de elementos.

6voto

Anders Sandvig Puntos 7964

Para la coloración, se especifica una lista de colores o se generan.

En este último caso, le sugiero que ejecute este código

n = 32;
main.name = paste("color palettes; n=",n)
ch.col = c("rainbow(n, start=.7, end=.1)", "heat.colors(n)", "terrain.colors(n)",            "topo.colors(n)", "cm.colors(n)");

nt <- length(ch.col)
i <- 1:n; 
j <- n/nt; 
d <- j/6; 
dy <- 2*d;

plot(i,i+d, type="n", yaxt="n", xaxt="n", ylab="", , xlab ="", main=main.name)   #yaxt="n" set no y axie label and tick.
for (k in 1:nt) {
rect(i-.5, (k-1)*j+ dy, i+.4, k*j, col = eval(parse(text=ch.col[k])), border = "grey");
text(2.5*j, k * j + dy/2, ch.col[k])
}

extraído del blog http://statisticsr.blogspot.com/2008/07/color-scale-in-r.html

El trazado de barras debe hacerse con ?barplot

DF=data.frame(names=c("tomato", "potato", "cabbage", "sukuma-wiki", "terere"), freq=c(7,4,5,8,20))
barplot(as.matrix(DF[,2]), col=heat.colors(length(DF[,2])), legend=DF[,1], xlim=c(0,9), width=2)

0 votos

Gracias, pero no veo cómo aplicarlo antes de dibujar el gráfico.

0 votos

¿algo así? Esto es una simple visualización de datos, te sugiero que leas algunos tutoriales

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X