2012-07-05 16 views
9

Próbuję więc ułożyć wykres słupkowy z szerokością paska odwzorowaną na zmienną; ale chcę, żeby odstęp między moimi taktami był stały.Wykres słupkowy w ggplot2 z szerokością jako zmienną i równomiernym odstępem między kreskami

Czy ktoś wie, jak wprowadzić stałą odstępu między prętami?

Teraz mam to:

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

Z góry dzięki.

Oto moje dane przy okazji (przepraszam za długi, wielkogabarytowych dput):

> 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

Możesz rozważyć użycie + facet_grid (~ Data). To sprawia, że ​​wykres jest znacznie czytelniejszy. –

Odpowiedz

4

Próba # 2.

jestem oszukiwanie ggplot2 do pisania ciągłej skali jako kategoryczne.

# 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

Na dokładkę jesteś prawdopodobnie będzie chciał dostosować rozmiar tekstu. To jest robione z ... + opts(axis.text.y=theme_text(size=12))

8

Dla kategorycznego lub „dyskretnego” skali - można regulować szerokość, ale to musi być pomiędzy 0 a 1. Twój value.x's umieścił go na 1, stąd nakładanie się. Można użyć przeskalowanie z pakietów skale dostosować to tak szybko, że w obrębie kategorii szerokość paska jest przedstawicielem innej zmiennej (w tym przypadku 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() 

grać z przeskalowania dla optymalnego widzenia” "zmieniać od 0,5 do 0,25 ... itd

enter image description here

Osobiście uważam, że coś w tym jest bardziej pouczający:

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

Dziękuję za odpowiedź, ale tak naprawdę próbuję zatrzymać nakładanie się nie przez zmianę szerokości prętów (potrzebuję dużej różnicy szerokości, aby była efektywna wizualnie), czekam na wymuszenie ilości pusta przestrzeń między prętami jest stała. Czy można to zrobić? – user1443010

+0

Widzę również, że w niektórych sytuacjach siatka aspektów byłaby lepszym wyborem, ale w tej sytuacji wartość w latach osiąga wartość końcową, więc dla moich celów oryginalny format jest dobry. – user1443010

+0

Dla zmiennych jakościowych nie uważam, że istnieje sposób dostosowania szerokości w sposób unikalny dla każdego elementu skali. Chociaż wprowadzono pewne zmiany w scale_x_discrete() w 0.91, więc być może twoje pytanie będzie lepiej odpowiedziano na liście dyskusyjnej ggplot2. Jeśli chodzi o najlepszy widok, być może umieszczenie etykiety na każdym pasku byłoby pomocne, jeśli zamierzasz je zachować razem, ale nadal chcesz porównać kategorie. –

Powiązane problemy