построение потока электронной почты на карте с использованием R - PullRequest
10 голосов
/ 26 марта 2012

Я хочу построить электронную почту от и до в мире.Например, я получил следующее количество электронных писем из следующих стран, и я живу в США.

recievedcountry <- c("India", "China", "France", "Chile", "Australia", "Chad",
                    "Nepal", "Burma")
rfrequency <- c(12, 20, 5, 2, 12, 1, 3, 2) # frequency of emails 
sendcountry <- c("Canda", "USA", "France", "India", "China", "Japan")
sfrequency <- c(14, 108, 12, 15, 18, 4)

Это то, что я пробовал, но я не знаю, как связаться со строками:

require(fields)
world(xlim=c(-90,90),ylim=c(-180,180), xaxt = "s", yaxt = "s")
grid()

Вот моя гипотетическая модель:

enter image description here

Ответы [ 3 ]

6 голосов
/ 30 марта 2012

На основании AdresT (спасибо!) Ссылки, приведенной выше, я мог бы ответить на свой собственный вопрос , за исключением того, что мыслительность линии пропорциональна количеству писем

Вот код:Я использовал случайные данные без поиска точной долготы и широты для каждого местоположения.

library(maps)
library(geosphere)
map("world", col = "green4", bg="#F5FFFA", lwd=0.05)
myposition <- c(-74, 40) # my position (where I am opening emails)

rlong <- c(75, 105, 135, - 10.2,  45.2, -30.4, 105, 35, -150, 
   10.2,  145.2, 30.4) # received lat
rlat <- c(30, 43, 23, 12, 68, 55.6, 30, 43, 23, 12, 68, 55.6) # received long
nrecived <- c(4, 10, 5, 2, 4, 10, 4, 10, 5, 2, 4, 10 )     # number of email received
slong <- c(85, 85, 55, -40.2,  45.2, -30.4,45, 95, 55, 40.2,  55.2, 60.4 ) # send lat
slat <- c(10, 43, 13, 12, 68, 55.6,10, 43, 13, 12, 68, 55.6 ) # send long
nsend <- c(4, 10, 5, 2, 4, 10, 4, 10, 5, 2, 4, 10 )     # number of email send

mydf <- data.frame (rlat, rlong, nrecived, slat, slong, nsend)

for (i in 1: length (mydf) ) {
            send <- gcIntermediate(c(mydf[i,]$slong, mydf[i,]$slat), c(-74, 40), 
                   n=100, addStartEnd=TRUE)
            lines (send, col = "blue", lwd = mydf[i, "nsend"]) # edited 
                                                                following suggestion 
            received <- gcIntermediate(c(mydf[i,]$rlong, mydf[i,]$rlat), c(-74, 40), 
             n=100,  addStartEnd=TRUE)
            lines (received , col = "red", lwd = mydf[i, "nrecived"])
            }

Карта вывода: enter image description here

Если кто-то может помочь, толщина линии, пропорциональная количеству писем, будет отличной!

После исправления следующего предложения по размеру строки от Романа Луштрика,

enter image description here

Возможно, потребуется изменить размер строки на широкую, чтобы уменьшить ее число!

6 голосов
/ 26 марта 2012

Это уже думали раньше. Посмотрите на эту запись в блоге, она описывает, как очень тщательно построить такую ​​карту.

http://flowingdata.com/2011/05/11/how-to-map-connections-with-great-circles/

0 голосов
/ 10 марта 2016

Вот решение , как сделать карты потоков в R, используя ggplot2.Вы можете сделать плоские или сферические карты: enter image description here enter image description here

...