最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

graph - DiagrammeR - set node position not working after updating to R vers 4.4.2 - Stack Overflow

programmeradmin3浏览0评论

I'm trying to customize node position on an x and y axis in a network diagram using DiagrammeR, using the following node, position and edges dfs:

nodesdat <- read.table(text = "
id label color fillcolor fontcolor fontsize
1   1    A1 black     white     black       16
2   2    A3 black     white     black       16
5   5    A6 black     white     black       16
18 18    Si black     white     black       16
19 19    Z1 black     white     black       16
", header = TRUE)

positionsdat <- read.table(text = "
label id color fillcolor fontcolor fontsize x y
1     A1  1 black     white     black       16 3 3
2     A3  2 black     white     black       16 3 4
5     A6  5 black     white     black       16 3 5
18    Si 18 black     white     black       16 2 4
19    Z1 19 black     white     black       16 5 4
", header = TRUE)

edgesdat <- read.table(text = "
id from to          rel  dir arrowhead arrowtail  style color
1   1    1  1 connected_to both      odot      none dashed black
2   2    2  2 connected_to both      odot      none dashed black
5   5    5  5 connected_to both      odot      none dashed black
39 39   18  1 connected_to both    normal      odot dashed black
40 40   18  5 connected_to both    normal      odot  solid black
41 41   18 18 connected_to both      odot      none  solid black
42 42   19  2 connected_to both      odot    normal  solid black
43 43   19 19 connected_to both      odot      none  solid black
68 68   18  2 connected_to both      none    normal dashed black
69 69   18  2 connected_to both    normal      odot  solid black
", header = TRUE)

library(DiagrammeR)
library(DiagrammeRsvg)
library(dplyr)

g <- create_graph(nodes_df = nodesdat, edges_df = edgesdat, directed = TRUE)

render_graph(g)

g2 <- g %>%
  add_global_graph_attrs(attr = "width",value = 0.5, attr_type = "node") %>%     #node size %>%
  add_global_graph_attrs(attr = "penwidth",value = 2, attr_type = "edge" )  %>%  #edge size
  set_node_position(node=nodesdat$id,x = positionsdat$x, positionsdat$y) 

I get the error "Error in !use_labels && !(node %in% graph$nodes_df[, 1]) : 'length = 5' in coercion to 'logical(1)'" from the set_node_position line.

This error doesn't happen when I run the code in R vers 4.0.2, but I've upgraded to 4.4.2

I'm trying to customize node position on an x and y axis in a network diagram using DiagrammeR, using the following node, position and edges dfs:

nodesdat <- read.table(text = "
id label color fillcolor fontcolor fontsize
1   1    A1 black     white     black       16
2   2    A3 black     white     black       16
5   5    A6 black     white     black       16
18 18    Si black     white     black       16
19 19    Z1 black     white     black       16
", header = TRUE)

positionsdat <- read.table(text = "
label id color fillcolor fontcolor fontsize x y
1     A1  1 black     white     black       16 3 3
2     A3  2 black     white     black       16 3 4
5     A6  5 black     white     black       16 3 5
18    Si 18 black     white     black       16 2 4
19    Z1 19 black     white     black       16 5 4
", header = TRUE)

edgesdat <- read.table(text = "
id from to          rel  dir arrowhead arrowtail  style color
1   1    1  1 connected_to both      odot      none dashed black
2   2    2  2 connected_to both      odot      none dashed black
5   5    5  5 connected_to both      odot      none dashed black
39 39   18  1 connected_to both    normal      odot dashed black
40 40   18  5 connected_to both    normal      odot  solid black
41 41   18 18 connected_to both      odot      none  solid black
42 42   19  2 connected_to both      odot    normal  solid black
43 43   19 19 connected_to both      odot      none  solid black
68 68   18  2 connected_to both      none    normal dashed black
69 69   18  2 connected_to both    normal      odot  solid black
", header = TRUE)

library(DiagrammeR)
library(DiagrammeRsvg)
library(dplyr)

g <- create_graph(nodes_df = nodesdat, edges_df = edgesdat, directed = TRUE)

render_graph(g)

g2 <- g %>%
  add_global_graph_attrs(attr = "width",value = 0.5, attr_type = "node") %>%     #node size %>%
  add_global_graph_attrs(attr = "penwidth",value = 2, attr_type = "edge" )  %>%  #edge size
  set_node_position(node=nodesdat$id,x = positionsdat$x, positionsdat$y) 

I get the error "Error in !use_labels && !(node %in% graph$nodes_df[, 1]) : 'length = 5' in coercion to 'logical(1)'" from the set_node_position line.

This error doesn't happen when I run the code in R vers 4.0.2, but I've upgraded to 4.4.2

Share Improve this question asked Jan 17 at 20:16 Hard_CourseHard_Course 3211 silver badge5 bronze badges
Add a comment  | 

1 Answer 1

Reset to default 1

Might be the case that this worked in an older version of R or perhaps an older version of DiagrammeR. But at least for the most recent version of DiagrammeR, i.e. 1.0.11 the docs mention that set_node_position can only be used to set the position of one node at a time, i.e. node= should be

A single-length vector containing either a node ID value (integer) or a node label (character) for which position information should be applied.

Hence, to fix you issue set the node positions for each node in sequence, e.g. you can loop over the rows of positionsdat using Reduce like so:

library(DiagrammeR)
library(DiagrammeRsvg)
library(dplyr)

g <- create_graph(
  nodes_df = nodesdat,
  edges_df = edgesdat,
  directed = TRUE
)

render_graph(g)

g2 <- g %>%
  add_global_graph_attrs(
    attr = "width", value = 0.5,
    attr_type = "node"
  ) %>% # node size %>%
  add_global_graph_attrs(
    attr = "penwidth", value = 2,
    attr_type = "edge"
  ) %>% # edge size
  Reduce(
    \(x, y) {
      set_node_position(
        x,
        node = y$id,
        x = y$x,
        y = y$y
      ) 
    },
    x = split(positionsdat, ~id),
    init = .
  )

render_graph(g2)

发布评论

评论列表(0)

  1. 暂无评论