2016-03-02 95 views
2

在下面的例子分層在levelplot顯示值,我需要在每個由所述分組變量class分層面板的顯示每個細胞的值:R:由分組變量

library("lattice") 
x <- seq(pi/4, 5*pi, length.out=5) 
y <- seq(pi/4, 5*pi, length.out=5) 
r1 <- as.vector(sqrt(outer(x^2, y^2, "+"))) 
r2 <- as.vector(sqrt(outer(x^2, y^2, "/"))) 

grid1 <- grid2 <- expand.grid(x=x, y=y) 
grid1$z <- cos(r1^2)*exp(-r1/(pi^3)) 
grid2$z <- cos(r2^2)*exp(-r2/(pi^3)) 
grid <- rbind(grid1, grid2) 
grid$class <- c(rep("addition",length(x)^2), rep("division", length(x)^2)) 

p <- levelplot(z~x*y | factor(class), grid, 
       panel=function(...) { 
       arg <- list(...) 
       panel.levelplot(...) 
       panel.text(arg$x, arg$y, round(arg$z,1))}) 
print(p) 

然而,因爲小組選項不區分這兩個小組,所以小區值相互疊加。我怎樣才能讓這些值在每個組中正確顯示? enter image description here

回答

1

略幕後,晶格使用稱爲subscripts到子集的數據在不同的面板顯示的參數。通常情況下,它並不需要知道它,但這不是其中的一種情況。

查看panel.levelplot的源代碼,發現它自己處理subscriptsargs(panel.levelplot)顯示它是函數的正式參數之一,函數的主體顯示它如何使用它們。

panel.text()(真的只是lattice:::ltext.default()的包裝),另一方面,不知道或做任何事情subscripts。從致電panel.text(x,y,z)x,yz,看到的是data.frame grid的完整列,這就是爲什麼您看到您所做的重疊繪圖。

,以便爲在當前面板的一部分值繪製文本,你需要明確使用subscripts說法,是這樣的:

myPanel <- function(x, y, z, ..., subscripts=subscripts) { 
    panel.levelplot(x=x, y=y, z=z, ..., subscripts=subscripts)   
    panel.text(x = x[subscripts], 
       y = y[subscripts], 
       labels = round(z[subscripts], 1)) 
} 
p <- levelplot(z~x*y | factor(class), grid, panel = myPanel) 
print(p) 

enter image description here

+0

謝謝你的非常詳細回答。我已經通過使用'panel.number()'找出瞭解決方法,但是您的解決方案更加優雅。 – aenima

+0

非常歡迎。這是一個很好的問題,最終給我一個更好的處理方法,而且不需要混淆下標。 –