【问题标题】:Adding Labels to Graph Nodes向图形节点添加标签
【发布时间】:2022-07-04 13:58:45
【问题描述】:

我使用“visnetwork”库制作了以下图表:

library(tidyverse)
library(igraph)


set.seed(123)
n=15
data = data.frame(tibble(d = paste(1:n)))

relations = data.frame(tibble(
  from = sample(data$d),
  to = lead(from, default=from[1]),
))

data$name = c("new york", "chicago", "los angeles", "orlando", "houston", "seattle", "washington", "baltimore", "atlanta", "las vegas", "oakland", "phoenix", "kansas", "miami", "newark" )

graph = graph_from_data_frame(relations, directed=T, vertices = data) 


 #red circle: starting point and final point
V(graph)$color <- ifelse(data$d == relations$from[1], "red", "orange")

plot(graph, layout=layout.circle, edge.arrow.size = 0.2, main = "my_graph")

library(visNetwork)

    a = visIgraph(graph)  

m_1 = 1
m_2 = 23.6

 a = toVisNetworkData(graph) %>%
    c(., list(main = paste0("Trip ", m_1, " : "), submain = paste0 (m_2, "KM") )) %>%
    do.call(visNetwork, .) %>%
    visIgraphLayout(layout = "layout_in_circle") %>% 
    visEdges(arrows = 'to') 
  • 我现在尝试根据它们出现的顺序为每个单独的节点添加数字标签(即“红色圆圈”始终为 1,按照箭头直到到达 2,等等):

我尝试在数据文件中添加一个额外的列以包含这些数字(每个“数字标签”对应于访问城市的顺序):

#is there an "automatic" way to do this? i did this manually:
data$label = c(11, 5, 2, 12, 7, 6, 10, 14, 15, 4, 12, 9, 13, 3,1)

然后我尝试将“数字标签”和“名称标签”(即城市)添加到 visnetwork 图中的节点:

V(graph)$name = data$label = c(11, 5, 2, 12, 7, 6, 10, 14, 15, 4, 12, 9, 13, 3,1)

plot(graph, layout=layout.circle, edge.arrow.size = 0.2, main = "my_graph")

library(visNetwork)

    a = visIgraph(graph)  

m_1 = 1
m_2 = 23.6

 a = toVisNetworkData(graph) %>%
    c(., list(main = paste0("Trip ", m_1, " : "), submain = paste0 (m_2, "KM") )) %>%
    do.call(visNetwork, .) %>%
    visIgraphLayout(layout = "layout_in_circle") %>% 
    visEdges(arrows = 'to') 

a

但它给了我一个错误:

Error in `.rowNamesDF<-`(x, value = value) : 
  duplicate 'row.names' are not allowed
In addition: Warning message:
non-unique value when setting 'row.names': ‘12’ 

最后,我还是想做这张图(使用 visnetwork):

还有其他方法吗?

谢谢!

【问题讨论】:

    标签: r graph label data-visualization igraph


    【解决方案1】:

    报错原因是没有8,有2个12s。

    sort(c(11, 5, 2, 12, 7, 6, 10, 14, 15, 4, 12, 9, 13, 3, 1))
    # [1]  1  2  3  4  5  6  7  9 10 11 12 12 13 14 15
    # missing 8, two 12
    

    动态获取订单——(这使用您在上面的代码中创建的第一个 a 对象)

    library(tidyverse)
    
    # collect the correct order
    
    df2 <- data %>% 
      mutate(d = as.numeric(d),
             nuname = factor(a$x$edges$from, 
                             levels = unlist(data$name))) %>%
      arrange(nuname) %>% 
      select(d) %>% unlist(use.names = F)
    #  [1] 11  5  2  8  7  6 10 14 15  4 12  9 13  3  1 
    

    如果您在此处编写代码时设置标签,则会覆盖您当前拥有的标签。

    有几个选项:保持原样,组合标签,或者你知道我不知道的东西。

    使用这些值和您的代码:

    V(graph)$name = data$label = df2
    

    给你:

    要组合标签,您可以:

    V(graph)$name = data$label = paste0(df2, "\n", data$name)
    

    这给了你:

    【讨论】:

    • 非常感谢凯特!这是一个非常聪明的答案!我绝对喜欢它!
    • 我花了一周时间尝试不同的方法来解决这个问题 (stackoverflow.com/questions/71244872/…) - 假设你有 25 个这样的网络图(visnetwork 格式)。假设您想将所有这 25 个图表放在同一页面上 - 我注意到标题总是重叠 :( 。您认为您可能对如何处理这种重叠有任何建议吗?非常感谢 - 您的帮助一直非常有价值!
    【解决方案2】:

    在我看来,您的代码过于复杂,难以掌握您方法的整体逻辑。所以我试着把它变轻一点,把它结构得更好。

    请在下方找到生成所需图形所需的完整代码。

    注意:按照惯例,我们通常在描述graph 时使用术语'nodes' 和'edges'。这也有助于使代码更易于阅读。所以我用'nodes' 来引用你的'data' 数据集,用'edges' 来引用你的'relations' 数据集。

    Reprex

    • 构建图表的代码
    library(dplyr)
    library(igraph)
    
    set.seed(123)
    n=15
    
    # Build the dataframe of 'nodes'
    nodes <- data.frame(d = 1:n,
                        name = c("new york", "chicago", "los angeles", "orlando", "houston", 
                                 "seattle", "washington", "baltimore", "atlanta", "las vegas", 
                                 "oakland", "phoenix", "kansas", "miami", "newark"))
    
    # Build the dataframe of 'edges'
    edges <- data.frame(from = sample(nodes$d)) %>% 
                          mutate(to = lead(from, default = from[1]))
    
    # Build the graph
    graph <- graph_from_data_frame(edges, directed = TRUE, vertices = nodes) %>% 
      set_vertex_attr("name", 
                      index = V(.), 
                      paste0(order(as.numeric(edges$from)), "\n", nodes$name)) %>% 
      set_vertex_attr("color",
                      index = V(.),
                      ifelse(nodes$d == edges$from[1], "red", "orange"))
    
    • 可视化图表的代码
    library(visNetwork)
    
    m_1 <- 1
    m_2 <- 23.6
    
    a <- toVisNetworkData(graph) %>%
      c(., list(main = paste0("Trip ", m_1, " : "), submain = paste0 (m_2, "KM") )) %>%
      do.call(visNetwork, .) %>%
      visIgraphLayout(layout = "layout_in_circle") %>% 
      visEdges(arrows = 'to') 
    a
    

    由reprex package (v2.0.1) 于 2022-03-01 创建

    【讨论】:

    • 感谢您的回答!你是对的——我认为我把一切都复杂化了,我会尝试从头开始编写新代码。非常感谢!
    • 我会尝试看看这种新方法是否有助于解决我正在研究的其他问题:stackoverflow.com/questions/71244872/…
    • @antonoyaro8,非常感谢您的反馈。是的,我已经看到了您提出的问题,并且已经解决了这个问题,但这并不是微不足道的,到目前为止我还没有找到解决方案。无论如何,只要没有人找到解决方案,我就会继续努力。干杯。
    • 非常感谢您对 Lovalery 的所有支持 - 没有您就不可能!
    猜你喜欢
    • 1970-01-01
    • 2010-10-03
    • 2016-12-15
    • 2012-07-24
    • 1970-01-01
    • 2020-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多