Add a scale bar and a north arrow outside of the facet plot plot area

I want to add a scale bar and a north arrow outside of the facet plot plot area. As an example, consider the following faceted plot as shown in Max Marchi's blog post ( link ):

# Load the data
airports <- read.csv("https://raw.githubusercontent.com/jpatokal/openflights/master/data/airports.dat", header = FALSE)
colnames(airports) <- c("ID", "name", "city",
  "country", "IATA_FAA", "ICAO", "lat", "lon",
   "altitude", "timezone", "DST")

routes <- read.csv("https://github.com/jpatokal/openflights/raw/master/data/routes.dat", header = FALSE)
colnames(routes) <- c("airline", "airlineID",
  "sourceAirport", "sourceAirportID",
  "destinationAirport", "destinationAirportID",
  "codeshare", "stops", "equipment")

# Getting the data ready for plotting
# * For a detailed explanation on setting up the data I suggest consulting Max Marchi post: 
# http://www.milanor.net/blog/maps-in-r-plotting-data-points-on-a-map/
library(plyr)
departures <- ddply(routes, .(sourceAirportID), "nrow")
names(departures)[2] <- "flights"
arrivals <- ddply(routes, .(destinationAirportID), "nrow")
names(arrivals)[2] <- "flights"
airportD <- merge(airports, departures, by.x = "ID", 
                  by.y = "sourceAirportID")
airportA <- merge(airports, arrivals, by.x = "ID", 
                  by.y = "destinationAirportID")
airportD$type <- factor("departures")
airportA$type <- factor("arrivals")

# The final data frame used for plotting
airportDA <- rbind(airportD, airportA)

# Get the map of Europe from Google Maps
library(ggmap)
map <- get_map(location = 'Europe', zoom = 4)

# Make a facetted map plot 
library(ggplot2)
facet.gmap <- ggmap(map) +
  geom_point(aes(x = lon, y = lat, 
  size = sqrt(flights)), 
  data = airportDA, alpha = .5) +
  scale_size(breaks = sqrt(c(1, 5, 10, 50, 100, 500)), 
  labels = c(1, 5, 10, 50, 100, 500), name = "routes") + 
  theme(legend.position = "bottom",
        legend.direction="horizontal") +
  guides(size=guide_legend(nrow=1)) +  
  facet_wrap( ~ type, ncol=2)  
facet.gmap

      

enter image description here I want to add a scale bar and a north arrow outside the plot area, for example on the right side of the plot legend, to get something like this:

enter image description here

I tried using the functions scalebar

and north

package ggsn

, however these functions allow you to add scale bars and north arrows inside the plot area. My attempts to use the following functions:

# Adding a scale bar (but can't positioned it outside of the plot area)
library(ggsn)
bb <- attr(map, "bb")
bb2 <- data.frame(long = unlist(bb[c(2, 4)]), lat = unlist(bb[c(1,3)]))

scale.bar <- facet.gmap +
  scalebar(data = bb2, dist = 250, dd2km = TRUE, 
    model  = "WGS84",
    st.size=2.5,
    height=0.015,  
    location = "topleft",
    facet.var='airportDA$type',
    facet.lev='departures', 
    anchor = c(
      x = bb$ll.lon + 0.05 * (bb$ur.lon - bb$ll.lon), 
      y = bb$ll.lat + 0.9 * (bb$ur.lat - bb$ll.lat) )) 
scale.bar

# Adding a north arrow (but can't positioned it outside of the plot area)
north2(scale.bar,x=0.12,y=0.90, scale=0.09, symbol=3) 

      

Does anyone have any suggestions? Thanks in advance.

+3


source to share


1 answer


I really figured it out! I know I like 7 months before the show ...

remove 'airport $' from facet.var

and it works unexpectedly.



scale.bar <- facet.gmap +
  scalebar(data = bb2, dist = 250, dd2km = TRUE, 
           model  = "WGS84",
           st.size=2.5,
           height=0.015,  
           location = "topleft",
           facet.var='type',
           facet.lev="arrivals", 
           anchor = c(
             x =-10, 
             y = 65 )) 
scale.bar

# Adding a north arrow (but can't positioned it outside of the plot area)
north2(scale.bar,x=0.82,y=0.17, scale=0.09, symbol=3) 

      

enter image description here

+1


source







All Articles