2016-10-19 3 views
1

Я пытаюсь построить график с R и igraph, используя сочетание форм и растровых изображений для вершин. Я изменил пример igraph ниже, чтобы воспроизвести мою проблему. Кто-нибудь может понять, что не так? Для проверки скрипта вам понадобится файл png.R igraph, как рисовать вершины со смешением форм и растра?

library(png) 
library(igraph) 

img.1 <- readPNG(system.file("img", "Rlogo.png", package="png")) 

shapes <- setdiff(shapes(), "") 

g <- make_ring(length(shapes)) 

V(g)$shape <- shapes 

#change the rectangle variants to raster 
V(g)$shape[grepl("rect",V(g)$shape)] <- "raster" 
#give every vertex the same image, regardless of shape 
V(g)$raster <- replicate(vcount(g), img.1, simplify=FALSE) 

plot(g, 
    vertex.size=15, vertex.size2=15, 
    vertex.pie=lapply(shapes, function(x) if (x=="pie") 2:6 else 0), 
    vertex.pie.color=list(heat.colors(5))) 

ответ

0

Это, по-видимому, один из способов, но для его подгонки требуется небольшая ручная настройка.

library(png) 
library(igraph) 

# Your code 
img.1 <- readPNG(system.file("img", "Rlogo.png", package="png")) 
shapes <- setdiff(shapes(), "") 
g <- make_ring(length(shapes)) 
V(g)$shape <- shapes 

# Change some shapes to user defined   
V(g)$shape[grepl("rect",V(g)$shape)] <- "myimg" 

# Using idea from http://igraph.org/r/doc/shapes.html 
# define function for image 
# manually tweaked the x any y to increase size of image 
myimg <- function(coords, v=NULL, params) { 
      vertex.size <- 1/200 * params("vertex", "size") 
      if (length(vertex.size) != 1 && !is.null(v)) { 
      vertex.size <- vertex.size[v] 
      } 
      rasterImage(img.1, 
      coords[,1]-vertex.size, coords[,2]-vertex.size, 
      coords[,1]+vertex.size, coords[,2]+vertex.size) 
      } 

# add shape 
add_shape("myimg", plot=myimg) 

# plot 
plot(g, vertex.size=seq(5, 5*length(shapes), 5), vertex.size2=seq(5, 5*length(shapes), 5) 
    vertex.pie=lapply(shapes, function(x) if (x=="pie") 2:6 else 0), 
    vertex.pie.color=list(heat.colors(5))) 

Чтобы дать

enter image description here

Осмелюсь сказать, что есть более igraph подход к этому

+0

Это прекрасно работает. Есть ли способ настроить функцию так, чтобы не квадратные изображения сохраняли соотношение сторон при изменении размера? – skellpco

+0

@skellpco; что связано с установкой аргумента 'vertex.size2': уменьшите или увеличьте размер' vertex.size', чтобы растянуть фигуры (в нужном вам направлении. см. '? igraph.plotting' – user20650

Смежные вопросы