Sasak
Sasak

Reputation: 199

Connecting two specific points in a map

Using this we have a map with data points:

Load data:

countries <- structure(list(country = structure(c(5L, 6L, 3L, 4L, 10L, 8L, 
11L, 7L, 1L, 13L, 9L, 12L, 2L), .Label = c("Australia", "China", 
"France", "Georgia", "India", "Ireland", "Malaysia", "Poland", 
"Qatar", "Singapore", "South Africa", "Spain", "USA"), class = "factor"), 
    Latitude = c(20.593684, 53.142367, 46.227638, 32.165622, 
    1.352083, 51.919438, -30.559482, 4.210484, -25.274398, 37.09024, 
    25.354826, 40.463667, 35.86166), Longitude = c(78.96288, 
    -7.692054, 2.213749, -82.900075, 103.819836, 19.145136, 22.937506, 
    101.975766, 133.775136, -95.712891, 51.183884, -3.74922, 
    104.195397), Value = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    2L, 1L, 2L, 2L)), .Names = c("country", "Latitude", "Longitude", 
"Value"), class = "data.frame", row.names = c(NA, -13L))

Code for map plot using this:

library(maps)
 library(ggplot2)
 base_world <- map_data("world")
p <- ggplot() + 
   geom_polygon(data=base_world, aes(x=long, y=lat, group=group)) +
   geom_point(data=countries, aes(x=Longitude, y=Latitude, colour="blue"), size=5, alpha=I(0.7))

I try to connect to points. Example I want to connect: Spain - China USA - Spain

What I have until now is this:

p + geom_line(data=countries, aes(x=Longitude, y=Latitude), color="black", size=1)

and this connects all points in the map. Is it possible to connect only specific values and show in the data point in the map the number of value column?

Also this is what I tried for number labels in every point (Value)

p + geom_text(aes(label=countries$Value),hjust=0, vjust=0, aes(x=Longitude, y=Latitude))
Error: ggplot2 doesn't know how to deal with data of class uneval

Example of the list with more than two points (every row is a different connection):

("USA", "Spain","China")
("Australia", "Poland")

Upvotes: 1

Views: 776

Answers (1)

M--
M--

Reputation: 28825

You can get a subset based on the points you want to be connected;

link1 <- countries[countries$country %in% c("USA", "Spain","China"), ]
link2 <- countries[countries$country %in% c("Australia", "Poland"), ]

base_world <- map_data("world")
p <- ggplot() + 
      geom_polygon(data=base_world, aes(x=long, y=lat, group=group)) +
      geom_line(data=link1, aes(x=Longitude, y=Latitude), color="red", size=1) +
      geom_line(data=link2, aes(x=Longitude, y=Latitude), color="green", size=1) +
      geom_point(data=countries, aes(x=Longitude, y=Latitude), colour = "cyan", size=5, alpha=I(0.7)) + #set the color outside of `aes`
      theme(text = element_text(size=20), legend.position="none")  #remove the legend  

and your plot would look like:

> p

MAP-ggplot2-worldmap-connections-p

You may need to play around a little bit for formatting issues.

Upvotes: 2

Related Questions