2011-11-02 85 views
3

我尝试在具有多个面板的格子条形图中为条形添加标签。我结束了太多的标签(每个标签都在每个面板中)。向格子条形图中的面板添加文本

这里是我的代码:

library(lattice) 
data(iris) 

barchart(seq(1,50) ~ Petal.Width + Petal.Length | Species, data = iris, stack = TRUE, 
     panel=function(x, y, ...) { 
       panel.barchart(x, y, ...); 
       ltext(x=iris$Petal.Width/2, y=y, labels=iris$Petal.Width, cex = 0.5); 
       ltext(x=iris$Petal.Width + iris$Petal.Length/2, y=y, labels=iris$Petal.Width, cex = 0.5); 
     } 
) 

我将如何做到这一点吗?

奖金的问题:
在它旁边的预期,我觉得我的代码是不是太有效率(特别是seq(1,50)Petal.Width + Petal.Length)不起作用。有没有更好的办法?

谢谢!

+0

的这里的基本问题是如何使用'lattice'将标签放在堆积的条形图上。这是在这里回答:http://stackoverflow.com/q/3220702/602276 – Andrie

+0

嗯,也许我不明白,但我的问题不是“如何把标签放在堆积的条形图”,但“如何使标签匹配它们所属的面板“。 这个问题是否真的在你关联的线程中得到了回答? – speendo

+1

是的,它确实是同样的问题。为了证明这一点,我在下面使用面板函数的简化版本提供了一个答案(但是其核心思想是相同的 - 计算每个“y”的'x'的累积和)。 HTH。 – Andrie

回答

8

这里的问题是如何在lattice中将标签添加到堆叠条形图中。答案在this question提供,但由于链接的答案不具有多个面板,我用基础R在这里重新建立一个简单的答案:

您必须修改面板功能如下:

  • 计算每个y值的x值的累积总和
  • 这是一个经典的拆分,应用,组合问题。您可以使用plyr这个(如链接的答案),或者像我说明,splitdo.call

xx <- do.call(c, unname(lapply(split(x, y), function(t)cumsum(t)-t/2)))

代码:

barchart(1:10 ~ Petal.Width + Petal.Length | Species, 
      data = iris[c(1:10, 51:60, 101:110), ], 
      stack = TRUE, 
      panel=function(x, y, ...) { 
      panel.barchart(x, y, ...) 
      xx <- do.call(c, unname(lapply(split(x, y), function(t)cumsum(t)-t/2))) 
      ltext(xx, y=y, labels=x) 
     } 
) 

enter image description here

+0

谢谢!但在这里Petal.Length的标签不在Petal.Length酒吧中间,而是在整个酒吧中间。 – speendo

+0

好的,我错误地复制了链接答案中的解决方案。它现在应该是固定的。 – Andrie

+0

我编辑了另一个工作选项的解决方案,但你的更好:) – speendo