2017-07-17 5 views
1

Dire que j'ai un terrain comme celui-ci:ggplot: lignes clipping entre facettes

# Load libraries 
library(ggplot2) 
library(grid) 

# Load data 
data(mtcars) 

# Plot results 
p <- ggplot(data = mtcars) 
p <- p + geom_bar(aes(cyl)) 
p <- p + coord_flip() 
p <- p + facet_wrap(~am) 

print(p) 

enter image description here

Maintenant, je veux tracer des lignes tout le chemin à travers les deux facettes où les barres sont. J'ajoute ceci:

p <- p + geom_vline(aes(xintercept = cyl)) 

enter image description here

qui ajoute les lignes, mais ils ne se croisent pas les deux facettes. Alors, je tente de désactiver le découpage en utilisant cette solution:

# Turn off clipping 
gt <- ggplot_gtable(ggplot_build(p)) 
gt$layout$clip[gt$layout$name == "panel"] <- "off" 

# Plot results 
grid.draw(gt) 

mais cela ne résout pas le problème: les lignes sont toujours coupées. Donc, je me demandais si cela est spécifique à geom_vline et essayé des approches avec geom_abline et geom_line (ce dernier avec des valeurs à travers ± Inf), mais les résultats sont les mêmes. Dans d'autres publications, la solution d'écrêtage semble fonctionner pour le texte et les points, mais il est probable que dans ce cas les lignes ne sont définies que dans les limites de la figure. (J'ai même essayé gt$layout$clip <- "off" pour désactiver tout écrêtage possible, mais cela n'a pas résolu le problème.) Y at-il une solution de contournement?

+2

Est-ce que [cette réponse] (https://stackoverflow.com/a/31691313/496488) fait ce dont vous avez besoin? – eipi10

+0

Il ressemble certainement à ça. Merci! Apparemment, j'ai particulièrement faible Google Fu aujourd'hui ... – Lyngbakr

+0

En fait, ce code ne semble pas fonctionner pour moi (ou pour une autre personne qui a posté il ya quelques heures). Quelqu'un d'autre peut-il le faire fonctionner avec succès? – Lyngbakr

Répondre

0
library(grid) 
library(gtable) 

# Starting from your plot `p` 
gb <- ggplot_build(p) 
g <- ggplot_gtable(gb) 

# Get position of y-axis tick marks 
ys <- gb$layout$panel_ranges[[1]][["y.major"]] 


# Add segments at these positions 
# subset `ys` if you only want to add a few 
# have a look at g$layout for relevant `l` and `r` positions 
g <- gtable_add_grob(g, segmentsGrob(y0=ys, y1=ys, 
            gp=gpar(col="red", lty="dashed")), 
        t = 7, l = 4, r=8) 

grid.newpage() 
grid.draw(g) 

Voir ggplot, drawing multiple lines across facets pour savoir comment redimensionner des valeurs pour un traçage plus général. c'est-à-dire

data2npc <- function(x, panel = 1L, axis = "x") { 
    range <- pb$layout$panel_ranges[[panel]][[paste0(axis,".range")]] 
    scales::rescale(c(range, x), c(0,1))[-c(1,2)] 
} 

start <- sapply(c(4,6,8), data2npc, panel=1, axis="y") 

g <- gtable_add_grob(g, segmentsGrob(y0=start, y1=start), 
         t=7, r=4, l=8)