2012-07-05 18 views
9

Por lo tanto, estoy tratando de hacer un gráfico de barras apiladas con ancho de barra mapeado a una variable; pero quiero que el espacio entre mis barras sea constante.Gráfico de barras en ggplot2 con ancho como variable e incluso espaciado entre barras

¿Alguien sabe cómo hacer el espaciado constante entre las barras?

En este momento tengo esto:

p<-ggplot(dd, aes(variable, value.y, fill=Date, width=value.x/15))+ coord_flip() + opts(ylab="") 

p1<-p+ geom_bar(stat="identity") + scale_fill_brewer(palette="Dark2") + scale_fill_hue(l=55,c=55) 

p2<-p1 + opts(axis.title.x = theme_blank(), axis.title.y = theme_blank()) 

p2 

enter image description here

Gracias de antemano.

He aquí mis datos por cierto (lo siento por el largo, dput voluminosos):

> dput(dd) 
structure(list(variable = structure(c(1L, 1L, 1L, 1L, 1L, 3L, 
3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 7L, 7L, 7L, 7L, 7L, 2L, 2L, 
2L, 2L, 2L, 6L, 6L, 6L, 6L, 6L, 5L, 5L, 5L, 5L, 5L, 9L, 9L, 9L, 
9L, 9L, 8L, 8L, 8L, 8L, 8L), .Label = c("Alcohol and Tobacco", 
"Health and Personal Care", "Clothing", "Energy", "Recreation and Education", 
"Household", "Food", "Transportation", "Shelter"), class = "factor", scores = structure(c(2.91, 
5.31, 10.08, 15.99, 4.95, 11.55, 11.2, 27.49, 20.6), .Dim = 9L, .Dimnames = list(
    c("Alcohol and Tobacco", "Clothing", "Energy", "Food", "Health and Personal Care", 
    "Household", "Recreation and Education", "Shelter", "Transportation" 
    )))), value.x = c(2.91, 2.91, 2.91, 2.91, 2.91, 5.31, 5.31, 
5.31, 5.31, 5.31, 10.08, 10.08, 10.08, 10.08, 10.08, 15.99, 15.99, 
15.99, 15.99, 15.99, 4.95, 4.95, 4.95, 4.95, 4.95, 11.55, 11.55, 
11.55, 11.55, 11.55, 11.2, 11.2, 11.2, 11.2, 11.2, 27.49, 27.49, 
27.49, 27.49, 27.49, 20.6, 20.6, 20.6, 20.6, 20.6), Date = structure(c(5L, 
4L, 3L, 2L, 1L, 5L, 4L, 3L, 2L, 1L, 5L, 4L, 3L, 2L, 1L, 5L, 4L, 
3L, 2L, 1L, 5L, 4L, 3L, 2L, 1L, 5L, 4L, 3L, 2L, 1L, 5L, 4L, 3L, 
2L, 1L, 5L, 4L, 3L, 2L, 1L, 5L, 4L, 3L, 2L, 1L), .Label = c("1993-2001", 
"2001-2006", "2007-2010", "2010-2011", "2012 Jan - May"), class = "factor"), 
    value.y = c(2.1, 2.5, 7.6, 21.7, 2.8, 1.5, 0.3, -4.1, -4.2, 
    4.7, 3, 16.9, 1.9, 32.8, 23.9, 3.2, 4.6, 11.3, 8.9, 12.9, 
    1.7, 2, 7.8, 5.9, 10, 1.9, 2.1, 5.6, 2.2, 9.9, 1.4, 1.3, 
    2.2, 0.6, 17.3, 1.1, 2.3, 6.4, 13.1, 10, 4.3, 7.6, 0.9, 15.2, 
    20.5)), .Names = c("variable", "value.x", "Date", "value.y" 
), row.names = c(NA, -45L), class = "data.frame") 
+0

Es posible que desee considerar el uso de + facet_grid (~ Date). Hace un gráfico mucho más legible. –

Respuesta

4

Intento # 2.

estoy engañando ggplot2 en la escritura de una escala continua como categóricas.

# The numbers for tmp I calculated by hand. Not sure how to program 
# this part but the math is 
# last + half(previous_width) + half(current_width) 
# Change the 1st number in cumsum to adjust the between category width 

tmp <- c(2.91,7.02,14.715,27.75,38.22,46.47,57.845,77.19,101.235) + cumsum(rep(5,9))

dd$x.pos1 <- rep(tmp,each=5) 
ggplot(dd,aes(x=x.pos1,y=value.y,fill=Date)) + 
geom_bar(aes(width=value.x),stat="identity",position="stack") + 
scale_x_continuous(breaks=tmp,labels=levels(dd$variable)) + 
coord_flip() 

enter image description here

Por si fuera poco lo que probablemente va a querer ajustar el tamaño del texto. Eso se hace con ... + opts(axis.text.y=theme_text(size=12))

8

Para una escala "discreta" categórica o - se puede ajustar el ancho, pero tiene que estar entre 0 y 1. Su value.x lo pone sobre 1, de ahí la superposición. Puede utilizar reescalar, a partir de los paquetes de escalas para ajustar esto de manera rápida para que el ancho dentro de la categoría de la barra es representativa de alguna otra variable (en este caso value.x)

install.packages("scales") 
library(scales) 
ggplot(dd,aes(x=variable,y=value.y,fill=Date)) + 
geom_bar(aes(width=rescale(value.x,c(0.5,1))),stat="identity",position="stack")' + 
coord_flip() 

Juego con reescalado de visión óptima" "cambiar a 0,5 de 0.25 ... etc

enter image description here

personal, creo que algo como esto es más informativo:

ggplot(dd,aes(x=variable,y=value.y,fill=Date)) + 
geom_bar(aes(width=rescale(value.x,c(0.2,1))),stat="identity") + 
coord_flip() + facet_grid(~Date) + opts(legend.position="none") 

enter image description here

+0

Gracias por la respuesta, pero en realidad estoy tratando de detener la superposición no reajustando el ancho de las barras (necesito el diferencial de gran ancho para que sea visualmente efectivo), estoy buscando forzar la cantidad de espacio en blanco entre barras para ser constante. Se puede hacer esto? – user1443010

+0

También veo cómo en algunas situaciones la cuadrícula de facetas sería una mejor opción, pero en esta situación el valor en los años culmina en un valor final, por lo que para mis propósitos, el formato original es bueno. – user1443010

+0

Para las variables categóricas, no creo que haya una forma de ajustar el ancho de forma única para cada elemento de la escala. Aunque se han realizado algunos ajustes en scale_x_discrete() en 0.91, quizás su pregunta se responda mejor en la lista de correo ggplot2. Con respecto a la mejor vista, quizás, poner una etiqueta en cada barra sea útil si va a mantenerlos juntos, pero aún desea comparar categorías. –

Cuestiones relacionadas