Primer paso: Prerequisitos

El primer paso es importar las bibliotecas o paquetería necesarias para hacer grafos

Las siguientes líneas de código se deben ejecutar para instalar las biliotecas: install.packages(“igraph”) install.packages(“reshape2”)

library(igraph)
## 
## Attaching package: 'igraph'
## The following objects are masked from 'package:stats':
## 
##     decompose, spectrum
## The following object is masked from 'package:base':
## 
##     union
library(reshape2)

Segundo paso: importar los datos

Lo siguiente que hay que hacer es importar los datos del csv con que vamos a trabajar

matriz <- read.csv("matriz2.csv", row.names = 1)

Tercer paso: Convertir la matriz

En este paso convertiremos la variable a una matriz de tres columnas

matriz_larga <- melt(as.matrix(matriz))

y luego le asignaremos un nuevo nombre a cada columna. Los nombres actuales son Var1, Var2 y value. Si queremos ver los nombres, podemos ejecutar la función colnames(matriz_larga)

colnames(matriz_larga)
## [1] "Var1"  "Var2"  "value"

Cambiar el nombre nos permite tener un mejor entendimiento de lo que tenemos en nuestro conjunto de datos

colnames(matriz_larga) <- c("Personaje", "Tema", "Peso")

Cuarto paso: Limpiar la matriz

matriz_larga <- matriz_larga[!is.na(matriz_larga$Peso) & matriz_larga$Peso > 0, ]

Quinto paso: el grafo

grafo <- graph_from_data_frame(d = matriz_larga, directed = FALSE)

Sexto paso: ver el grafo

En la siguiente instrucción se van a pintar los nodos del grafo. La función plot(grafo,…) es la que va a mostrar el dibujo.

  1. Dentro de la función, el tamaño del grafo lo da vertex.size = 10. El número indica el tamaño en pixeles. Para la cantidad de información que venimos trabajando, 10 pixeles es una mejor opción.

  2. vertex.label.cex ajusta el tamaño de las etiquetas de los nodos. Según la escala que maneja, 1 es un tamaño normal; un valor menor que 1 es más pequeño y un valor mayor a 1 es más grande de lo normal.

  3. edge.width ajusta el grosor de las aristas. En el código presentado, el grosor de cada arista estará dado por su valor dentro de la matriz dividido entre 3 para que las aristas más pesadas no se vean demasiado gruesas.

plot(grafo,
     vertex.size = 10, #Tamaño del nodo
     vertex.label.cex = 0.85, #Tamaño de la etiqueta
     edge.width = E(grafo)$Peso / 3, # Grosor de las aristas
     main = "Grafo de Correspondencia")

Séptimo paso: mejor visualización (opcional)

La siguiente sección es sólo para mostrar de mejor forma el grafo. El primer paso para usar las formas de distribución es la siguiente línea

# 1. Definir el atributo 'type' para cada nodo
# Personajes = TRUE, Temas = FALSE
V(grafo)$type <- V(grafo)$name %in% rownames(matriz)

Uno de cada lado

# Aplicar layout bipartito
plot(grafo,
     layout = layout_as_bipartite(grafo),
     vertex.color = ifelse(V(grafo)$type, "lightblue", "lightgreen"),
     vertex.size = 30,
     vertex.label.cex = 0.8,
     edge.width = E(grafo)$Peso / 5,
     main = "Grafo Bipartito")

En círculo

# Graficar con layout
plot(grafo,
     layout = layout_in_circle(grafo),
     vertex.color = ifelse(V(grafo)$type, "lightblue", "lightgreen"),
     vertex.size = 30,
     vertex.label.cex = 0.8,
     edge.width = E(grafo)$Peso / 5,
     main = "Grafo de Correspondencia")

Con atracción de gravedad

# Graficar con layout
plot(grafo,
     layout = layout_with_fr(grafo),
     vertex.color = ifelse(V(grafo)$type, "lightblue", "lightgreen"),
     vertex.size = 30,
     vertex.label.cex = 0.8,
     edge.width = E(grafo)$Peso / 5,
     main = "Grafo de Correspondencia")