2016-03-19 3 views
1

Ich versuche dotplot() von'Lattice' zu verwenden, um einen Datensatz zu plotten, wo Kategorien nur für eine Teilmenge vorhanden sind, und ich rufe scales = list(y = list(relation = "free")) an, um unnötige vertikale Abstände zu vermeiden. Dies scheint jedoch den vertikalen Abstand zwischen den Elementen zu vertuschen. Was mehr ist, das ist anscheinend damit verbunden, ob sich die Kategorien überlappen oder nicht, denn nur dann tritt der Fehler auf.Inkonsistenter Abstand im Gitter-Punktplot zwischen y-Werten

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

Sie können deutlich sehen, dass der Abstand zwischen zum Beispiel 90 und 3 ausgeschaltet sind, während es kein Problem mit den Männern und Frauen ist. Jetzt, wenn ich die Kategorien ändere, die numerische Werte haben, damit sie sich nicht überschneiden, bekomme ich korrekten Abstand.

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

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

Imgur

Weiß jemand, was los ist und was ich kann dieses Problem beheben tun?

Antwort

2

Sie können eine Funktion vom Autor lattice (siehe dotplot, dropping unused levels of 'y') verwenden.

Zitiert Deepayan Sarkar aus diesem Beitrag:

„Es ist ein bisschen problematisch Grundsätzlich Sie relation="free"/"sliced" verwenden können, aber y verhält sich wie as.numeric(y) würde Also, wenn die kleine Teilmenge in jeder Platte ist immer mehr oder weniger zusammenhängender.. (in Bezug auf die Ebenen zueinander sind nah), dann würden Sie gut. Sonst würden Sie nicht. in diesem Fall können Sie immer noch Ihre eigenen prepanel und panel Funktionen schreiben „,

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