Home > Blockchain >  How to make a flow diagram of travel on Maps in R?
How to make a flow diagram of travel on Maps in R?

Time:09-03

This is my dataframe:

df:

Country          Total       lon        lat
United Kingdom   7,200,000   -3.43597   55.37805
China            5,359,000   104.1954   35.86166
Canada           6,016,000   -106.347   56.13037
Brazil           5,269,000   -51.9253   -14.235
France           4,484,000   2.213749   46.22764
Australia        4,014,000   133.7751   -25.2744
Mexico           0           -102.553   23.6345

I am new to R. I am trying to make a flow map showing travel history from many different countries to Mexico. The destination is Mexico, so all the data flow will be in one direction. Based on the Total value, I want to change the thickness of the arrows. For example, France has a Total of less value than United Kingdom, so its thickness will be less. I don't know how to make the connections between countries. I have used the following codes to make a layout:

library(maps)
library(tidyverse)
library(ggmap)
library(ggplot2)
theme_set(theme_bw())
library(sf)
library("rnaturalearth")
library("rnaturalearthdata")

world <- ne_countries(scale = "medium", returnclass = "sf")
class(world)
new_df <- read.csv('df.csv')
ggrepel::geom_label_repel

ggplot(data = world)  
  geom_sf() geom_point(data=new_df, aes(x=lon, y=lat), colour='red') 
  ggrepel::geom_label_repel(data = new_df, 
                            aes(x = lon, y = lat), 
                            label = new_df$Country,
                            size = 2,
                            col = "blue")

Can someone please help me to draw the tourist flow to Mexico?

CodePudding user response:

You can use geom_curve and use the size argument. You can also use color to augment contrast:

new_df <- new_df %>% 
  mutate(Total = as.numeric(gsub(",", "", Total)),
         lon2 = lon[Country == "Mexico"],
         lat2 = lat[Country == "Mexico"])
#          Country   Total         lon       lat     lon2    lat2
# 1 United Kingdom 7200000   -3.435970  55.37805 -102.553 23.6345
# 2          China 5359000  104.195400  35.86166 -102.553 23.6345
# 3         Canada 6016000 -106.347000  56.13037 -102.553 23.6345
# 4         Brazil 5269000  -51.925300 -14.23500 -102.553 23.6345
# 5         France 4484000    2.213749  46.22764 -102.553 23.6345
# 6      Australia 4014000  133.775100 -25.27440 -102.553 23.6345
# 7         Mexico       0 -102.553000  23.63450 -102.553 23.6345   


ggplot(data = world)  
  geom_sf()   
  geom_curve(data = new_df[-7, ], 
             aes(x = lon, y = lat, xend = lon2, yend = lat2, size = Total, color = Total),
             curvature = -0.2, 
             lineend = "round",
             arrow = arrow(length = unit(0.1, "cm")))  
  scale_size(range = c(.5, 3), label = scales::comma)  
  scale_color_distiller(label = scales::comma, 
                        palette = "Reds", 
                        direction = 1)  
  guides(color = guide_legend(), 
         size = guide_legend())  
  ggrepel::geom_label_repel(data = new_df, aes(x = lon, y = lat), 
                            label = new_df$Country, size = 2, col = "blue")  
  ggthemes::theme_map()

enter image description here

  • Related