2013-03-27 75 views
5

我想用ggplot2做一個情節,但我正在努力與geom瓷磚。當我第一次使用這個geom時,我仔細查看了Hadley的文檔,但是我仍然沒有設法得到我所追求的。我想調整瓷磚寬度和瓷磚高度。我發現如何在文檔中調整瓷磚寬度,但我正在爲高度而努力。以在接下來的情節爲出發點:如何調整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

我現在想調整磚的高度爲好。在第一個「列」(其中x = 1)的底部拼貼從0運行到1,並且第一列中的頂部拼貼運行從1到4.在第二列中,我想使底部拼貼運行從0到3,頂部從3到4.最後一列我希望底部從0到1.5,頂部從1.5到4.我嘗試了很多東西,例如以下內容:

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)) 

但沒有產生我正在尋找的陰謀。

任何幫助將不勝感激。提前致謝!

回答

7

geom_tile取審美height=h並生成ymin和從-h/2 to h/2ymax。這就是爲什麼你沒有得到你打算的陰謀。儘管我完全支持@Didzis的解決方案,因爲它非常簡單並且可以完成工作,所以我將使用geom_tile來展示解決方案,原因有兩個。這很有趣,總是很高興知道:)。

的目標是「生成」你y位置相應取決於高度,這樣的情節是如您所願。以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

現在,你看到的高度都整齊地產生(y最小和y)

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

謝謝Arun,我現在更瞭解瓷磚geom! – Edwin 2013-03-27 10:24:52

+0

我很高興你選擇了我的答案。但除非你有很強的理由,否則我不認爲這裏需要「瓷磚」。我認爲@Didzis解決方案更適合您的數據。你說什麼,Didzis? – Arun 2013-03-27 10:26:04

+1

@Arun至少對我來說,繪製數據的接縫只是堆疊不同寬度的鏤空 – 2013-03-27 10:28:14

5

而不是geom_tile()使用geom_bar()使用並使用h作爲y值。您也可以爲geom_bar()設置width=,但您會收到可以忽略的警告。

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

enter image description here

+0

感謝漂亮的解決方案,並沒有使瓦片和酒吧之間的鏈接。 – Edwin 2013-03-27 10:24:25