2013-03-27 15 views
5

Próbuję zrobić fabułę z ggplot2, ale walczę z płytką geom. Kiedy używam tego geomu po raz pierwszy, przyjrzałem się bliżej dokumentacji Hadleya, ale wciąż nie udało mi się uzyskać tego, co chcę. Chcę dostosować zarówno szerokość płytki, jak i wysokość płytki. Znalazłem sposób dostosowania szerokości płytki w dokumentacji, ale zmagam się z wysokością. Biorąc następną działkę jako punkt wyjścia:Jak ustawić wysokość płytki w kafelku geom?

test <- data.frame(
    x = rep(c(1,3,6),2), 
    y = rep(c(1,3), each = 3), 
    w = rep(c(.5,2,1), 2), 
    z = sample(rep(LETTERS[1:6]))) 

ggplot(test, aes(x=x, y=y, fill = z)) + geom_tile(aes(width = w)) 

enter image description here

Chciałbym teraz, aby dostosować wysokość płytek, jak również. Z dolną płytką w pierwszej "kolumnie" (przy której x = 1) biegnie od 0 do 1, a górna płytka w pierwszej kolumnie biegnie od 1 do 4. W drugiej kolumnie chcę wykonać dolną płytkę od 0 do 3 i górna płytka od 3 do 4. Dla ostatniej kolumny chcę dole od 0 do 1.5, a na górze od 1,5 do 4. Próbowałem wielu rzeczy, np. co następuje:

test2 <- data.frame(
x = rep(c(1,3,6),2), 
y = c(0, 0, 0, 1, 3, 1.5), 
w = rep(c(.5,2,1), 2), 
z = sample(rep(LETTERS[1:6])), 
h = c(1, 3, 1.5, 3, 1, 2.5)) 

ggplot(test2, aes(x=x, y=y, fill = z)) + geom_tile(aes(width = w, heigth = h)) 

, ale żaden nie wyprodukował fabuły, której szukałem.

Każda pomoc zostanie bardzo doceniona. Z góry dziękuję!

Odpowiedz

7

geom_tile wykonuje estetyczny height=h generuje ymin i ymax z -h/2 to h/2. To dlatego nie planujesz intrygi. Chociaż w pełni popieram rozwiązanie @Didzis, ponieważ jest bardzo proste i wykonuje swoją pracę, pokażę rozwiązanie, używając geom_tile z dwóch powodów. To zabawne i zawsze miło wiedzieć :).

Celem jest "wygenerowanie" pozycji y odpowiednio w zależności od wysokości, aby działka była zgodna z oczekiwaniami. Biorąc test2 data.frame,

require(plyr) 
# calculate y coordinate accounting for shift in y due to h 
test2 <- ddply(test2, .(x), transform, y2 = c(0, head(h,-1)) + h/2) 
p <- ggplot(test2, aes(x=x, y=y2, fill = z)) + 
      geom_tile(aes(width = w, height=h)) 
p 

enter image description here

Teraz widać, że szczyty są starannie generowane (Ymin i Ymax)

ggplot_build(p)$data 

#  fill x y PANEL group xmin xmax ymin ymax 
# 1 #00BFC4 1 0.50  1  4 0.75 1.25 0.0 1.0 
# 2 #619CFF 1 2.50  1  5 0.75 1.25 1.0 4.0 
# 3 #00BA38 3 1.50  1  3 2.00 4.00 0.0 3.0 
# 4 #F8766D 3 3.50  1  1 2.00 4.00 3.0 4.0 
# 5 #B79F00 6 0.75  1  2 5.50 6.50 0.0 1.5 
# 6 #F564E3 6 2.75  1  6 5.50 6.50 1.5 4.0 
+0

Dzięki Arun, Rozumiem, że płytki geom są teraz lepsze! – Edwin

+0

Cieszę się, że wybrałeś moją odpowiedź. Ale chyba że masz silny powód, nie sądzę, że "kafelki" są tutaj wymagane. Rozwiązanie @Didzis jest bardziej odpowiednie dla twoich danych. Co powiesz, Didzis? – Arun

+1

@Arun Przynajmniej dla mnie to szwy, że dane są tylko spiętrzonymi plombami o różnej szerokości –

5

Zamiast geom_tile() użycie geom_bar() z stat="identity" i używać h jak y wartości. Możesz ustawić width= również dla geom_bar(), ale otrzymasz ostrzeżenie, które można zignorować.

ggplot(test2,aes(x,h,fill=z))+geom_bar(stat="identity",aes(width=w)) 

enter image description here

+0

Dzięki za miły rozwiązań, nie sprawiają, że połączenie między płytką a barem. – Edwin

Powiązane problemy