R:创建节点为图像的图形

And*_*son 19 r image graph

我正在尝试创建一个图形(图形理论中的图形,节点和边缘等),其中每个节点由文件中的图像(最好是某种栅格格式)表示.我查看了RGraphviz包,但不幸的shapefill是该属性是"目前不支持".

我也看了一下iGraph,但浏览文档我似乎找不到任何关于在图中使用图像的内容.

有没有人有在R内生成的图形中使用图像文件的经验?

Sac*_*amp 36

有一些方法可以手动执行此操作,因为您可以在R中读取和绘制图像(此处我使用rimage),图形通常也在xy平面上绘制.你可以igraph在R中使用你想要做的几乎任何事情,另一种方法是使用我自己的包qgraph,它也可以用来绘制各种类型的图.

在两个包中,节点的放置在具有两列的矩阵中指定/给出,并且每个节点的行指示x和y位置.两个包也绘制在-1到1的水平和垂直区域.因此,使用该布局矩阵,我们可以使用在正确位置绘制图像rasterImage.

我将从无向图(无箭头)开始.

首先我加载图像:

# Load rimage library:
library('rimage')

# Read the image:
data(logo)
img <- imagematrix(logo)
Run Code Online (Sandbox Code Playgroud)

并对要使用的图形进行采样(使用邻接矩阵):

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

然后在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))
Run Code Online (Sandbox Code Playgroud)

看起来像这样:

在qgraph中制作的网络

igraph你首先需要进行布局.此布局还需要重新调整以适应-1到1的绘图区域(这由绘图函数中的igraph本身完成):

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))
Run Code Online (Sandbox Code Playgroud)

igraph中的图形

现在,如果你想要有向图,它就不那么重要了,因为箭头需要指向图像的边缘.最好的方法是使用大小与图像大小相当的不可见方形节点.要做到这一点,你需要摆弄vsize参数qgraphvertex.size参数igraph.(如果你想我可以查找确切的代码,但这并不简单).

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))
Run Code Online (Sandbox Code Playgroud)

qgraph中的有向图

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))
Run Code Online (Sandbox Code Playgroud)

igraph中的有向图

2013年更新:

请注意,rimage不再使用CRAN,但您可以使用pngReadImages库.我刚刚更新qgraph了包含功能,这样做更容易.看这个例子:

# 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)
Run Code Online (Sandbox Code Playgroud)

这需要qgraph1.2版本才能工作.

  • 可爱的答案.SO提问者还想要什么? (2认同)