2011-02-12 84 views
19

我试图创建一个图形(图形如图理论,节点和边缘等),其中每个节点由文件中的图像表示(最好是某种栅格格式) 。我查看了RGraphviz软件包,但不幸的是shapefill属性是“当前不支持”。R:创建节点为图像的图形

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

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

回答

35

有一些方法可以手动执行此操作,因为你可以阅读和绘制R中的图像(这里我使用rimage)通常也绘制在x-y平面上。你可以使用igraph来处理几乎所有你想用R处理图表的东西,另一种方法是使用我自己的包qgraph,它也可以用来绘制各种类型的图。

在这两个软件包中,节点的放置都是在矩阵中指定/给定的,每个节点有两列和一行,表示x和y的位置。这两个软件包也绘制-1到1的水平和垂直区域。因此,通过该布局矩阵,我们可以使用rasterImage将图像绘制在正确的位置。

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

首先我加载图像:

# Load rimage library: 
library('rimage') 

# Read the image: 
data(logo) 
img <- imagematrix(logo) 

和样品的曲线图中使用(使用邻接矩阵):

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

然后在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)) 

哪看起来像这样:

the network made in 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)) 

The graph in igraph

现在如果你想向图是少琐碎,因为箭头需要指向图像的边缘。最好的方法是使用与图像大小相近的不可见方形节点。要做到这一点,你需要摆弄的参数qgraph或的vertex.size参数。 (如果你想我可以查找确切的代码,但它不是微不足道的)。

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)) 

Directed graph in 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)) 

Directed graph in 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) 

这需要qgraph版本1.2才能正常工作。

+2

可爱的答案。提问者想要什么呢? – Spacedman 2011-02-12 13:10:22