ggnetwork:如何在顶点上设置地理信息

时间:2018-04-06 14:36:32

标签: r ggplot2 ggnetwork

ggnetwork:如何将地理信息放在顶点上?

ggnetwork(n, layout = "fruchtermanreingold", cell.jitter = 0.75)

ggnetwork用于生成这些坐标的默认节点放置算法是Fruchterman-Reingold力导向布局算法。我想提供地理信息(lat,long)

2 个答案:

答案 0 :(得分:0)

documentation

  

layout参数还将接受用户提交的坐标作为   两列矩阵,其行数与节点中的节点数一样多   网络。

因此,您可以提供节点的坐标作为矩阵。但是它使用scale函数,原始值丢失了,只保留了相对位置。因此需要撤消缩放,或修改源以绕过缩放。它位于R/fortify.network.R

的第121行附近

答案 1 :(得分:0)

使ggnetwork与地理坐标一起工作所需的选项刚刚添加到该软件包的开发版本中。

以下示例:

library(dplyr)
library(nycflights13)
library(network)
# IMPORTANT: install from `devtools` or `remotes`
# remotes::install_github("briatte/ggnetwork")
library(ggnetwork)
library(ggmap)
library(ggplot2)

# edges: flights
e <- select(flights, origin, dest) %>%
  group_by(origin, dest) %>%
  tally %>% 
  filter(origin != dest, n > 2500) %>%  # no self-loops + thinning
  filter(origin %in% airports$faa, dest %in% airports$faa) # lose SJU

# weighted directed network
n <- network::network(select(e, origin, dest), directed = TRUE)
set.edge.attribute(n, "weight", e$n) # weight = number of flights

# nodes: airports
y <- filter(airports, faa %in% e$origin | faa %in% e$dest) %>% 
  select(faa, lat, lon)

# sanity check (no missing airports)
stopifnot(nrow(y) == network.size(n))

# named geo coordinate vectors...
lat <- y$lat
names(lat) <- y$faa
lon <- y$lon
names(lon) <- y$faa
# ... as a (x, y) coordinate matrix
geo <- cbind(lon[ network.vertex.names(n) ], lat[ network.vertex.names(n) ])

# geographic network
g <- ggnetwork(n, layout = geo, scale = FALSE) %>% 
  rename(lon = x, lat = y)

# map background
map <- ggmap::get_map(c(left = min(geo[, 1]), bottom = min(geo[, 2]), right = max(geo[, 1]), top = max(geo[, 2])))
# map + network plot
ggmap::ggmap(map) +
  geom_point(data = g, aes(lon, lat)) +
  geom_edges(data = g, aes(lon, lat, xend = xend, yend = yend)) +
  geom_nodelabel(data = g, aes(label = vertex.names))

ggsave("map_example.png")

map example