tag img funciona examples example image r graph

image - img - R: Creando gráficas donde los nodos son imágenes.



Estoy tratando de crear un gráfico (gráfico como en la teoría de gráficos, nodos y bordes, etc.) donde cada nodo esté representado por una imagen del archivo (preferiblemente un formato ráster). He buscado en el paquete RGraphviz, pero desafortunadamente el atributo shapefill es "Actualmente no es compatible".

También eché un vistazo a iGraph, pero al buscar en la documentación no pude encontrar nada sobre el uso de imágenes en los gráficos.

¿Alguien tiene experiencia con el uso de archivos de imagen en gráficos generados desde R?


Hay algunas formas de hacerlo manualmente, ya que puedes leer y trazar imágenes en R (aquí uso rimage ) y los gráficos también se trazan en un plano xy. Puede usar igraph para casi cualquier cosa que quiera hacer con gráficos en R, y una alternativa es usar mi propio paquete qgraph que también se puede usar para trazar varios tipos de gráficos.

En ambos paquetes, la ubicación de los nodos se especifica / se da en una matriz con dos columnas y una fila para cada nodo que indica la ubicación x e y. Ambos paquetes también trazan en un área horizontal y vertical de -1 a 1. Así que con esa matriz de diseño podemos trazar las imágenes en las ubicaciones correctas usando rasterImage .

Comenzaré con gráficos no dirigidos (sin flechas).

Primero cargo una imagen:

# Load rimage library: library(''rimage'') # Read the image: data(logo) img <- imagematrix(logo)

Y muestre una gráfica para usar (usando una matriz de adyacencia):

# Sample an adjacency matrix: set.seed(1) adj <- matrix(sample(0:1,10^2,T,prob=c(0.8,0.2)),10,10)

Luego en qgraph :

library(''qgraph'') # Run qgraph (plot the graph) and save the layout: L <- qgraph(adj,borders=FALSE,vsize=0,labels=F,directed=F)$layout # Plot images: apply(L,1,function(x)rasterImage(img,x[1]-0.1,x[2]-0.1,x[1]+0.1,x[2]+0.1))

Que se parece a esto:

En igraph primero necesitas hacer el diseño. Este diseño también debe volver a ajustarse para que se ajuste al área de trazado de -1 a 1 (esto se realiza mediante igraph en la función de trazado):

library(''igraph'') # Make the graph G <- graph.adjacency(adj,mode="undirected") # Create fixed layout: set.seed(1) L <- layout.fruchterman.reingold(G) # Rescale the layout to -1 to 1 L[,1]=(L[,1]-min(L[,1]))/(max(L[,1])-min(L[,1]))*2-1 L[,2]=(L[,2]-min(L[,2]))/(max(L[,2])-min(L[,2]))*2-1 # Plot: plot(G,layout=L,vertex.size=0,vertex.frame.color="#00000000",vertex.label="") # Set images: apply(L,1,function(x)rasterImage(img,x[1]-0.1,x[2]-0.1,x[1]+0.1,x[2]+0.1))

Ahora, si quieres gráficos dirigidos, es menos trivial, ya que las flechas deben apuntar hacia el borde de la imagen. La mejor manera de hacer esto es usar nodos cuadrados invisibles que tienen aproximadamente el tamaño de la imagen. Para hacer esto, necesitas vsize con el argumento qgraph en qgraph o el argumento igraph en igraph . (Si quieres, puedo buscar el código exacto para esto, pero no es trivial).

en qgraph :

L <- qgraph(adj,borders=FALSE,vsize=10,labels=F,shape="square",color="#00000000")$layout apply(L,1,function(x)rasterImage(img,x[1]-0.1,x[2]-0.1,x[1]+0.1,x[2]+0.1))

en igraph :

G <- graph.adjacency(adj) set.seed(1) L <- layout.fruchterman.reingold(G) L[,1]=(L[,1]-min(L[,1]))/(max(L[,1])-min(L[,1]))*2-1 L[,2]=(L[,2]-min(L[,2]))/(max(L[,2])-min(L[,2]))*2-1 plot(G,layout=L,vertex.size=17,vertex.shape="square",vertex.color="#00000000",vertex.frame.color="#00000000",vertex.label="") apply(L,1,function(x)rasterImage(img,x[1]-0.1,x[2]-0.1,x[1]+0.1,x[2]+0.1))

Actualización de 2013:

Tenga en cuenta que rimage ya no está en CRAN, pero puede usar png o la biblioteca ReadImages . Acabo de actualizar qgraph para incluir funcionalidad para hacer esto mucho más fácil. Vea este ejemplo:

# Download R logo: download.file("http://cran.r-project.org/Rlogo.jpg", file <- tempfile(fileext = ".jpg"), mode = "wb") # Sample an adjacency matrix: set.seed(1) adj <- matrix(sample(0:1, 10^2, TRUE, prob = c(0.8, 0.2)), 10, 10) # Run qgraph: qgraph(adj, images = file, labels = FALSE, borders = FALSE)

Esto requiere qgraph versión 1.2 para funcionar.