Adding individual arrows in multiple plots

2020-03-30 06:19发布

问题:

I want to add arrows in 2 plots produced with ggplot and faceting. Problem: how can I avoid a replication of the arrow in both graphs? I would like to add individual arrows to each plot. Here is an example:

library(ggplot2)
# data frame with fake data
xdf <- data.frame(x=rep(1:10,2)
                  ,y=c( 2*c(1:10)+rnorm(10,0,3), 4*c(1:10)+rnorm(10,0,5))
                  ,z=rep(c("A","B"),each=10)
                  )
xdf

# ggplot with faceting
   xp <- ggplot(xdf,aes(x=x,y=y)) +
       geom_line() +
       facet_grid(. ~ z)
   xp

# location of the arrow: x=4, y= on the top

(f1x4 <- xdf[4,"y"])+1
xp + geom_segment(aes(x=4,xend=4,y=f1x4+3,yend=f1x4)
                      , arrow=arrow(length=unit(0.4,"cm")
                        )
                     ) +
      geom_text(aes(x=4,y=f1x4+5, label="a"))

What happened: arrow is placed in both facets in the identical region. How can I choose a specific plot to place the arrows?

回答1:

As far as I can tell, to add individual layers onto a facet, you need to supply a data frame with the corresponding facet value.

From the ggplot2 facet_grid page:

# If you combine a facetted dataset with a dataset that lacks those 
# facetting variables, the data will be repeated across the missing 
# combinations: 

So just doing xp + geom_segment(aes(x,xend,y,yend)) will draw on all facets, because the facetting variable is missing.

Your facetting variable is z, so you can either:

  • create a dataframe arrow.df with x, y, and z being 'A'
  • feed the z into aes directly.

Second option seems handier:

xp + geom_segment(aes(x=4,xend=4,y=f1x4+3,yend=f1x4,z='A')  # <-- see the z='A'
                      , arrow=arrow(length=unit(0.4,"cm")
                        )
                     ) +
      geom_text(aes(x=4,y=f1x4+5, label="a",z='A'))         # <-- see the z='A'

So you just add in a factorvariablename=factor to the aes argument to plot on that particular panel (since your z column in the data frame for xp has levels 'A' and 'B').



标签: r ggplot2