2011-11-02 46 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

相關問題