我试图创建一个图形(图形如图理论,节点和边缘等),其中每个节点由文件中的图像表示(最好是某种栅格格式) 。我查看了RGraphviz软件包,但不幸的是shapefill
属性是“当前不支持”。R:创建节点为图像的图形
我也看了一下iGraph,但浏览文档我似乎无法找到关于在图形中使用图像的任何内容。
有没有人有使用图像文件从R内生成的图形文件的经验?
我试图创建一个图形(图形如图理论,节点和边缘等),其中每个节点由文件中的图像表示(最好是某种栅格格式) 。我查看了RGraphviz软件包,但不幸的是shapefill
属性是“当前不支持”。R:创建节点为图像的图形
我也看了一下iGraph,但浏览文档我似乎无法找到关于在图形中使用图像的任何内容。
有没有人有使用图像文件从R内生成的图形文件的经验?
有一些方法可以手动执行此操作,因为你可以阅读和绘制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))
哪看起来像这样:
在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))
现在如果你想向图是少琐碎,因为箭头需要指向图像的边缘。最好的方法是使用与图像大小相近的不可见方形节点。要做到这一点,你需要摆弄的参数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))
在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))
请注意,rimage
不再位于CRAN上,但您可以使用png
或ReadImages
库。我刚刚更新了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才能正常工作。
可爱的答案。提问者想要什么呢? – Spacedman 2011-02-12 13:10:22