2016-03-19 90 views
1

我試圖用'lattice'中的dotplot()來繪製一個數據集,其中只有一個子集存在類別,我打電話scales = list(y = list(relation = "free"))以避免不必要的垂直間距。但是,這樣做似乎掩蓋了項目之間的垂直間距。這更多的是似乎與這些類別是否重疊有關,因爲只有這樣纔會發生錯誤。y值之間的點陣圖中間距不一致

library(lattice) 

variables <- c(rep("Age", 4), rep("Sex", 2), rep("Children", 3)) 
levels <- c(1, 5, 100, 101, "Females", "Males", 2, 3, 90) 
values <- rnorm(9)  

dotplot(levels ~ values | variables, layout = c(1,3), 
     scales = list(y = list(relation = "free"))) 

Imgur

你可以清楚地看到,例如90和3之間的間距是關閉的,而沒有與男性和女性沒有問題。現在,如果我更改具有數值的類別以使它們不重疊,則可以得到正確的間距。

levels <- c(1:4, "Females", "Males", 5:7) 

dotplot(levels ~ values | variables, layout = c(1,3), 
     scales = list(y = list(relation = "free"))) 

Imgur

有誰知道是怎麼回事,我能做些什麼來解決這個問題?

回答

2

您可以使用作者lattice的功能(請參閱dotplot, dropping unused levels of 'y')。

從後報價Deepayan薩卡:

「這是一個有點問題基本上,你可以使用relation="free"/"sliced",但ÿ表現爲as.numeric(y)會這樣,如果在每塊面板的小部分總是或多或少連續的。 (在水平接近對方的條件),那麼你就可以了,否則你不會。在這種情況下,你仍然可以編寫自己的prepanelpanel功能,」

dotplot(levels ~ values | variables, layout = c(1,3), 
     scales = list(y = list(relation = "free")), 
     prepanel = function(x, y, ...) { 
      yy <- y[, drop = TRUE] 
      list(ylim = levels(yy), 
       yat = sort(unique(as.numeric(yy)))) 
     }, 
     panel = function(x, y, ...) { 
      yy <- y[, drop = TRUE] 
      panel.dotplot(x, yy, ...) 
     }) 

enter image description here