6

我正在尝试使用 ggplot2 进行绘图,但我正在努力处理几何图块。当我第一次使用这个 geom 时,我仔细查看了 Hadley 的文档,但我仍然没有设法得到我想要的东西。我想调整瓷砖宽度和瓷砖高度。我在文档中找到了如何调整瓷砖宽度,但我在努力解决高度问题。以下一个情节为起点:

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

在此处输入图像描述

我现在也想调整瓷砖的高度。第一个“列”中的底部图块(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))

但没有人产生我正在寻找的情节。

任何帮助将不胜感激。提前致谢!

4

2 回答 2

8

geom_tile采取审美height=h和产生yminymax-h/2 to h/2。这就是为什么你没有得到你想要的情节。虽然我完全支持@Didzis 的解决方案,因为它非常简单并且可以完成工作,但我将展示使用该解决方案geom_tile的两个原因。这很有趣,而且总是很高兴知道:)。

目标是根据高度相应地“生成”您的y位置,以便情节如您所愿。取data.frame,test2

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

在此处输入图像描述

现在,您会看到高度是整齐生成的(ymin 和 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
于 2013-03-27T10:09:42.917 回答
6

而不是geom_tile()使用geom_bar()withstat="identity"和 use hasy值。您也可以设置width=为,geom_bar()但您会收到可以忽略的警告。

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

在此处输入图像描述

于 2013-03-27T09:49:16.607 回答