2017-06-23 7 views
0

J'utilise xyplot() du Lattice pour tracer les flèches définies par une trame de données avec 3 colonnes: posi (numérique), de (caractère), à ​​(caractère). Le problème: À l'occasion, les flèches dépassent l'échelle de l'intrigue. En d'autres termes, la fenêtre de tracé n'est pas assez grande pour visualiser toutes les données.Le treillis xyplot ne montre pas tous les niveaux de facteur sur l'axe Y: tracé incomplet

J'ai essayé d'ajouter les niveaux de facteur explicitement, en vain. Il semble que si les niveaux les plus extrêmes (par exemple "D") ne sont pas présents dans le facteur "df $ from", ceux-ci ne sont pas comptés pour dessiner la fenêtre de tracé. J'ai regardé ylim mais ceci est limité aux valeurs numériques. J'ai regardé autour de SO, et j'ai trouvé beaucoup de choses concernant le rééchelonnement, le réarrangement des axes, mais rien qui m'a aidé avec le problème à portée de main. Cette question est liée à une question à @skan: How to plot segments or arrows in Lattice.

Mes données:

l <- c("A", "B", "C", "D") 
df <- data.frame(posi = c(1, 2, 3, 4, 5), 
       from = factor(c("A", "B", "C", "D", "A"), levels = l, ordered = TRUE), 
       to = factor(c("C", "D", "D", "C", "A"), levels = l, ordered = TRUE) 
) 

Cette parcelles comme prévu:

xyplot(from ~ posi , type="p", col="black", data=df, pch=16, xlim = c(0,7), 
     panel = function(...){ 
     panel.dotplot(x = df$posi, y = df$from, col ="green", cex=1.6) 
     panel.dotplot(x = (df$posi+1), y = df$to, col="black", cex=1.) 
     panel.arrows(x0 = df$posi, y0 = df$from, x1 = df$posi+1, y1 = df$to, lwd=2, col="blue") 
     } 
) 

enter image description here

Lorsque j'utilise uniquement les 3 premières lignes, de la même trame de données avec un facteur 'ancien' niveaux intacts, l'intrigue ne tient pas compte du fait que plus tard un niveau "D" sera nécessaire.

## only first 3 rows, without element "D" in the factor df$from 
df <- df[1:3, ] 

résultant dans ce complot:

enter image description here

Je veux être en mesure de fixer les limites de l'axe Y, et apprécierait toute aide ou conseil.

Répondre

1

Le problème peut être évité en spécifiant "drop.unused.levels = FALSE" dans l'appel de xyplot.

library(lattice) 

l <- c("A", "B", "C", "D") 
df <- data.frame(posi = c(1, 2, 3, 4, 5), 
      from = factor(c("A", "B", "C", "D", "A"), levels = l, 
          ordered = TRUE), 
      to = factor(c("C", "D", "D", "C", "A"), levels = l, 
         ordered = TRUE)) 


xyplot(from ~ posi , type="p", col="black", data=df, pch=16, xlim = c(0,7), 
    panel = function(...){ 
    panel.dotplot(x = df$posi, y = df$from, col ="green", cex=1.6) 
    panel.dotplot(x = (df$posi+1), y = df$to, col="black", cex=1.) 
    panel.arrows(x0 = df$posi, y0 = df$from, x1 = df$posi+1, y1 = df$to, 
        lwd=2, col="blue") 
    }) 

complete data

df2 <- df[1:3,] 
xyplot(from ~ posi , type="p", col="black", data=df2, pch=16, xlim = c(0,7), 
    drop.unused.levels = FALSE, 
    panel = function(...){ 
    panel.dotplot(x = df2$posi, y = df2$from, col ="green", cex=1.6) 
    panel.dotplot(x = (df2$posi+1), y = df2$to, col="black", cex=1.) 
    panel.arrows(x0 = df2$posi, y0 = df2$from, x1 = df2$posi+1, 
        y1 = df2$to, lwd=2, col="blue") 
    }) 

subset of data with unused factor levels