2013-03-27 51 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