Monday, May 30, 2022

IGRAPH R-code Sample on Ubuntu 20.04

 boris@boris-All-Series:~/IGRAPH$ cat RIgraph02.R

nodes <- read.csv("/home/boris/IGRAPH/Dataset1-Media-Example-NODES.csv", header=T, as.is=T)

links <- read.csv("/home/boris/IGRAPH/Dataset1-Media-Example-EDGES.csv", header=T, as.is=T)

library('igraph')

net <- graph_from_data_frame(d=links, vertices=nodes, directed=T)

E(net)       # The edges of the "net" object

V(net)       # The vertices of the "net" object

E(net)$type  # Edge attribute "type"

V(net)$media # Vertex attribute "media"


# Find nodes and edges by attribute:

# (that returns oblects of type vertex sequence/edge sequence)

V(net)[media=="BBC"]

E(net)[type=="mention"]

as_edgelist(net, names=T)

as_adjacency_matrix(net, attr="weight")


# Plot with curved edges (edge.curved=.1) and reduce arrow size:

# Note that using curved edges will allow you to see multiple links

# between two nodes (e.g. links going in either direction, or multiplex links)

plot(net, edge.arrow.size=.4, edge.curved=.1)


















sudo apt -y install r-cran-rjson

boris@boris-All-Series:~/IGRAPH$ cat CoutryGraph1.py

library(assertthat)

library(dplyr)

library(purrr)

library(igraph)

library(ggplot2)

library(ggraph)

library(ggmap)

country_coords_txt <- "

 1     3.00000  28.00000       Algeria

 2    54.00000  24.00000           UAE

 3   139.75309  35.68536         Japan

 4    45.00000  25.00000 'Saudi Arabia'

 5     9.00000  34.00000       Tunisia

 6     5.75000  52.50000   Netherlands

 7   103.80000   1.36667     Singapore

 8   124.10000  -8.36667         Korea

 9    -2.69531  54.75844            UK

10    34.91155  39.05901        Turkey

11  -113.64258  60.10867        Canada

12    77.00000  20.00000         India

13    25.00000  46.00000       Romania

14   135.00000 -25.00000     Australia

15    10.00000  62.00000        Norway"

# nodes come from the above table and contain geo-coordinates for some

# randomly picked countries

nodes <- read.delim(text = country_coords_txt, header = FALSE,

                    quote = "'", sep = "",

                    col.names = c('id', 'lon', 'lat', 'name'))

set.seed(123)  # set random generator state for the same output

N_EDGES_PER_NODE_MIN <- 1

N_EDGES_PER_NODE_MAX <- 4

N_CATEGORIES <- 4

# edges: create random connections between countries (nodes)

edges <- map_dfr(nodes$id, function(id) {

  n <- floor(runif(1, N_EDGES_PER_NODE_MIN, N_EDGES_PER_NODE_MAX+1))

  to <- sample(1:max(nodes$id), n, replace = FALSE)

  to <- to[to != id]

  categories <- sample(1:N_CATEGORIES, length(to), replace = TRUE)

  weights <- runif(length(to))

  data_frame(from = id, to = to, weight = weights, category = categories)

})

edges <- edges %>% mutate(category = as.factor(category))


g <- graph_from_data_frame(edges, directed = FALSE, vertices = nodes)


edges_for_plot <- edges %>%

  inner_join(nodes %>% select(id, lon, lat), by = c('from' = 'id')) %>%

  rename(x = lon, y = lat) %>%

  inner_join(nodes %>% select(id, lon, lat), by = c('to' = 'id')) %>%

  rename(xend = lon, yend = lat)

assert_that(nrow(edges_for_plot) == nrow(edges))

nodes$weight = degree(g)

maptheme <- theme(panel.grid = element_blank()) +

  theme(axis.text = element_blank()) +

  theme(axis.ticks = element_blank()) +

  theme(axis.title = element_blank()) +

  theme(legend.position = "bottom") +

  theme(panel.grid = element_blank()) +

  theme(panel.background = element_rect(fill = "#596673")) +

  theme(plot.margin = unit(c(0, 0, 0.5, 0), 'cm'))

country_shapes <- geom_polygon(aes(x = long, y = lat, group = group),

                               data = map_data('world'),

                               fill = "#CECECE", color = "#515151",

                               size = 0.15)

mapcoords <- coord_fixed(xlim = c(-150, 180), ylim = c(-55, 80))

ggplot(nodes) + country_shapes +

geom_curve(aes(x = x, y = y, xend = xend, yend = yend,  # draw edges as arcs

                 color = category, size = weight),

             data = edges_for_plot, curvature = 0.33,

             alpha = 0.5) +

scale_size_continuous(guide = FALSE, range = c(0.25, 2)) + # scale for edGe widths

geom_point(aes(x = lon, y = lat, size = weight),           # draw nodes

             shape = 21, fill = 'white',

             color = 'black', stroke = 0.5) +

scale_size_continuous(guide = FALSE, range = c(1, 6)) +    # scale for node size

geom_text(aes(x = lon, y = lat, label = name),             # draw text labels

            hjust = 0, nudge_x = 1, nudge_y = 4,

            size = 3, color = "white", fontface = "bold") +

  mapcoords + maptheme
















boris@boris-All-Series:~/IGRAPH$ cat CoutryGraph2.py

library(assertthat)

library(dplyr)

library(purrr)

library(igraph)

library(ggplot2)

library(ggraph)

library(ggmap)


country_coords_txt <- "

 1     3.00000  28.00000       Algeria

 2    54.00000  24.00000           UAE

 3   139.75309  35.68536         Japan

 4    45.00000  25.00000 'Saudi Arabia'

 5     9.00000  34.00000       Tunisia

 6     5.75000  52.50000   Netherlands

 7   103.80000   1.36667     Singapore

 8   124.10000  -8.36667         Korea

 9    -2.69531  54.75844            UK

10    34.91155  39.05901        Turkey

11  -113.64258  60.10867        Canada

12    77.00000  20.00000         India

13    25.00000  46.00000       Romania

14   135.00000 -25.00000     Australia

15    10.00000  62.00000        Norway"

# nodes come from the above table and contain geo-coordinates for some

# randomly picked countries

nodes <- read.delim(text = country_coords_txt, header = FALSE,

                    quote = "'", sep = "",

                    col.names = c('id', 'lon', 'lat', 'name'))

set.seed(123)  # set random generator state for the same output

N_EDGES_PER_NODE_MIN <- 1

N_EDGES_PER_NODE_MAX <- 4

N_CATEGORIES <- 4

# edges: create random connections between countries (nodes)

edges <- map_dfr(nodes$id, function(id) {

  n <- floor(runif(1, N_EDGES_PER_NODE_MIN, N_EDGES_PER_NODE_MAX+1))

  to <- sample(1:max(nodes$id), n, replace = FALSE)

  to <- to[to != id]

  categories <- sample(1:N_CATEGORIES, length(to), replace = TRUE)

  weights <- runif(length(to))

  data_frame(from = id, to = to, weight = weights, category = categories)

})

edges <- edges %>% mutate(category = as.factor(category))


g <- graph_from_data_frame(edges, directed = FALSE, vertices = nodes)


edges_for_plot <- edges %>%

  inner_join(nodes %>% select(id, lon, lat), by = c('from' = 'id')) %>%

  rename(x = lon, y = lat) %>%

  inner_join(nodes %>% select(id, lon, lat), by = c('to' = 'id')) %>%

  rename(xend = lon, yend = lat)

assert_that(nrow(edges_for_plot) == nrow(edges))

nodes$weight = degree(g)

maptheme <- theme(panel.grid = element_blank()) +

  theme(axis.text = element_blank()) +

  theme(axis.ticks = element_blank()) +

  theme(axis.title = element_blank()) +

  theme(legend.position = "bottom") +

  theme(panel.grid = element_blank()) +

  theme(panel.background = element_rect(fill = "#596673")) +

  theme(plot.margin = unit(c(0, 0, 0.5, 0), 'cm'))

country_shapes <- geom_polygon(aes(x = long, y = lat, group = group),

                               data = map_data('world'),

                               fill = "#CECECE", color = "#515151",

                               size = 0.15)

mapcoords <- coord_fixed(xlim = c(-150, 180), ylim = c(-55, 80))

ggplot(nodes) + country_shapes +

geom_curve(aes(x = x, y = y, xend = xend, yend = yend,  # draw edges as arcs

                 color = category, size = weight),

             data = edges_for_plot, curvature = 0.33,

             alpha = 0.5) +

scale_size_continuous(guide = FALSE, range = c(0.25, 2)) + # scale for edGe widths


geom_point(aes(x = lon, y = lat, size = weight),           # draw nodes

             shape = 21, fill = 'white',

             color = 'black', stroke = 0.5) +

scale_size_continuous(guide = FALSE, range = c(1, 6)) +    # scale for node size

geom_text(aes(x = lon, y = lat, label = name),             # draw text labels

            hjust = 0, nudge_x = 1, nudge_y = 4,

            size = 3, color = "white", fontface = "bold") +

  mapcoords + maptheme

theme_transp_overlay <- theme(

  panel.background = element_rect(fill = "transparent", color = NA),

  plot.background = element_rect(fill = "transparent", color = NA)

)

p_base <- ggplot() + country_shapes + mapcoords + maptheme

p_edges <- ggplot(edges_for_plot) +

geom_curve(aes(x = x, y = y, xend = xend, yend = yend,  # draw edges as arcs

                 color = category, size = weight),

             curvature = 0.33, alpha = 0.5) +

scale_size_continuous(guide = FALSE, range = c(0.5, 2)) +  

  mapcoords + maptheme + theme_transp_overlay +

  theme(legend.position = c(0.5, -0.1),

        legend.direction = "horizontal")

p_nodes <- ggplot(nodes) +

geom_point(aes(x = lon, y = lat, size = weight),

             shape = 21, fill = "white", color = "black",    # draw nodes

             stroke = 0.5) +

scale_size_continuous(guide = FALSE, range = c(1, 6)) +    # scale for node size

  geom_text(aes(x = lon, y = lat, label = name),             # draw text labels

            hjust = 0, nudge_x = 1, nudge_y = 4,

            size = 3, color = "white", fontface = "bold") +

mapcoords + maptheme + theme_transp_overlay

p <- p_base +

  annotation_custom(ggplotGrob(p_edges), ymin = -74) +

  annotation_custom(ggplotGrob(p_nodes), ymin = -74)

print(p)


































References

https://www.r-bloggers.com/2018/05/three-ways-of-visualizing-a-graph-on-a-map/





No comments:

Post a Comment