R: Создание графиков, где узлы являются изображениями - PullRequest
19 голосов
/ 12 февраля 2011

Я пытаюсь создать граф (граф, как в теории графов, узлы и ребра и т. Д.), Где каждый узел представлен изображением из файла (предпочтительно в некотором растровом формате). Я посмотрел в пакете RGraphviz, но, к сожалению, атрибут shapefill в настоящее время не поддерживается.

Я также взглянул на iGraph, но, просматривая документацию, я не смог найти ничего по использованию изображений в графиках.

Кто-нибудь имеет опыт использования файлов изображений в графиках, созданных в R?

Ответы [ 2 ]

36 голосов
/ 12 февраля 2011

Есть несколько способов сделать это вручную, так как вы можете читать и наносить на карту изображения в R (здесь я использую rimage), и графики, как правило, также наносятся на плоскость xy.Вы можете использовать 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 (это делается самим играфом в функции печати):

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

Теперь, если выДля ориентированных графов это менее тривиально, так как стрелки должны указывать на край изображения.Лучший способ сделать это - использовать невидимые квадратные узлы размером с изображение.Для этого вам нужно поиграться с аргументом vsize в qgraph или с аргументом vertex.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))

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, но вы можете использовать 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...