Диаграмма R граф в r-статистике: расстояние между узлами и другое форматирование в дереве - PullRequest
0 голосов
/ 21 января 2020

Я создаю концептуальную модель, которая включает в себя:

  1. Действия
  2. Прямые эффекты
  3. Косвенные эффекты
  4. Ценные компоненты

Действия связаны с прямыми и косвенными эффектами, связанными с оцениваемыми компонентами. Края создают много трафика c, поэтому я тщательно работаю над стилем и форматом, чтобы четко показать взаимосвязи.

Сначала я закодировал график с использованием grViz, но не смог найти способ получить действия, чтобы указать на Прямые Эффекты на одной стороне и Косвенные Эффекты на другой стороне, используя дублированные столбцы V C на обеих сторонах, в которые ведут эффекты. Ключевой проблемой было дублирование узлов V C, как показано здесь:

Концептуальная модель - график

Код, который я использовал:

library(DiagrammeR)

####
## Construction Phase ##
####

grViz("
  digraph dot {

graph [ layout = dot,
        overlap = true,
        fontsize = 10,
        rankdir = LR,
        nodesep = 0.2]

#######
## Setting the 'node' statements
#######

  ## Activities
      node [shape = box,
        style = filled,
        color = SandyBrown,
        fixedsize = true,
        fontname = Helvetica,
        penwidth = 1.0]
  # See Excel for Activity Codes
  'A1'; 'A2'; 'A3'; 'A4'; 'A5'; 'A11'; 'A17'; 'A18'; 'A21'; 'A24'

  ## Indirect Effects
      node [shape = polygon,
        sides = 6,
        fixedsize = true,
        style = filled,
        color = Wheat,
        width = 2.0]
      'Fragmentation'; 'Deterioration'; 'Contamination '

  ## Direct Effects
      node [shape = polygon,
        fixedsize = true,
        width = 2.0,
        style = filled,
        color = Tan]
      'Mortality'; 'Sensory'; 'Contamination'

  ## VC's
      node [shape = circle,
        fixedsize = true,
        style = filled,
        color = PaleGoldenrod,
        width = 0.6
        ]
        'AMMA'; #Long-toed Salamander
        'ANBO'; #Western Toad
        'TATA'; #American Badger
        'MAAM'; #American Marten
        'MBCA'; #Birds protected by MBCA and WA
        'CEEL'; #Elk
        'URAR'; #Grizzly Bear
        'MYLU'; #Little Brown Myotis
        'ALAL'; #Moose
        'NOGO'; #Northern Goshawk
        'SEOW'; #Short-Eared Owl
        'SWHA' #Swainson's Hawk

#####
## Edge statements - pathways
#####

  ## Indirect Effects
'Fragmentation' -> {'A2' 'A21' 'A11' 'A3'}[arrowhead = inv, dir = back, color=Grey]

'Deterioration' -> {'A5' 'A1' 'A11' 'A17'
                    'A18' 'A2' 'A21' 'A3' 'A4'}[arrowhead = inv, dir = back, color=Grey]

'Contamination ' -> 'A5'[arrowhead = inv, dir = back, color=Grey]


  ## Direct Effects on VC's
  'Mortality' -> {'AMMA' 'ANBO' 'TATA'
                  }[color=red, style=dashed, arrowhead = tee, arrowtail = none]

  'Sensory' -> {'TATA' 'MAAM' 'MBCA' 'CEEL' 'URAR' 'MYLU'
                'ALAL' 'NOGO' 'SEOW' 'SWHA'
               }[color=blue, style=dashed, arrowhead = tee, arrowtail = none]

  'Contamination' -> {'TATA' 'MBCA' 'CEEL' 'URAR' 'MYLU'
                      'AMMA' 'ALAL' 'SEOW' 'SWHA' 'ANBO'
                    }[color=purple, style=dashed, arrowhead = tee, arrowtail = none]

  ## Activity to Effect
  'A1' -> 'Mortality'[color=red]
  'A1' -> 'Sensory'[color=blue]
  'A2' -> 'Mortality'[color=red]
  'A2' -> 'Sensory'[color=blue]
  'A3' -> 'Mortality'[color=red]
  'A3' -> 'Sensory'[color=blue]
  'A4' -> 'Mortality'[color=red]
  'A4' -> 'Sensory'[color=blue]
  'A5' -> 'Mortality'[color=red]
  'A5' -> 'Sensory'[color=blue]
  'A5' -> 'Contamination'[color=purple]
  'A11' -> 'Mortality'[color=red]
  'A11' -> 'Sensory'[color=blue]
  'A17' -> 'Mortality'[color=red]
  'A17' -> 'Sensory'[color=blue]
  'A18' -> 'Mortality'[color=red]
  'A18' -> 'Sensory'[color=blue]
  'A21' -> 'Mortality'[color=red]
  'A21' -> 'Sensory'[color=blue]
  'A24' -> 'Mortality'[color=red]
}
")

Я повернулся к DiagrammeR, чтобы поместить узлы и ребра в кадры данных следующим образом:

   library(DiagrammeR)

# Create a Node Data Frame (NDF) for Activities
Act_nodes <- create_node_df(
  n = 10,
  type = "a",
  label = c("A1", "A2", "A3", "A4", "A5", "A11", "A17", "A18", "A21", "A24"),
  data = 1:10,
  shape = "box",
  fixedsize = TRUE,
  fontname = "Helvetica",
  penwidth = 1.0,
  width = 0.5,
  style = "filled",
  color = "black",
  fillcolor = "SandyBrown",
  fontcolor = "black")

DE_nodes <- create_node_df(
  n = 3,
  type = "b",
  label = c("Mortality", "Sensory", "Contamination"),
  data = 11:13,
  shape = "polygon",
  sides = 6,
  color = "black",
  fillcolor = "tan",
  fontcolor = "black",
  fixedsize = TRUE,
  fontname = "Helvetica",
  penwidth = 1.0,
  width = 1.0,
  style = "filled",
  x = c(-80,80,-80),
  y = c(-80,80,80))

Act_DE_comb <- combine_ndfs(
  Act_nodes,
  DE_nodes)

## Creating the edge data frames for Indirect Effects
 edges_contaminate <- 
      create_edge_df(
        from = c(5),
        to = c(13),
        color = "purple",
        rel ="a", 
        length = 500)

    edges_mortality <- 
      create_edge_df(
        from = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
        to = c(11, 11, 11, 11, 11, 11, 11, 11, 11, 11),
        color = "red",
        rel ="a")

    edges_sensory <- 
      create_edge_df(
        from = c(1, 2, 3, 4, 5, 6, 7, 8, 9),
        to = c(12, 12, 12, 12, 12, 12, 12, 12, 12),
        color = "blue",
        rel ="a")

    # Combine the edge data frames
    all_edges <-
      combine_edfs(edges_contaminate, edges_mortality, edges_sensory)

    graph <- create_graph(
        nodes_df = Act_DE_comb,
        edges_df = all_edges)

    render_graph(graph, layout = "tree")

Это привело к следующему:

Диаграмма дерева операций DiagrammeR для прямого воздействия

Я планирую объединить графики:

  1. Действия с прямыми эффектами
  2. Прямые эффекты с ценными компонентами
  3. Действия с косвенными эффектами
  4. Косвенные эффекты для оцениваемых компонентов

Я надеюсь, что смогу продублировать узлы оцениваемого компонента, чтобы они появлялись с левой и правой стороны, как я иллюстрировал выше. Однако проблема, с которой я сталкиваюсь, заключается в расстоянии между узлами прямого эффекта - они соприкасаются, и это приводит к визуальному траффику c застревания краев. В версии grViz узлы имели достаточное разделение, или я мог бы обойти это. Я следовал за этим вопросом и ответом на пост: Как увеличить расстояние между узлами в DiagrammeR R

Я попытался вставить координаты x, y, и это отображается в кадре данных (get_node_attrs):

  id type         label data   shape fixedsize  fontname penwidth width
1   1    a            A1    1     box      TRUE Helvetica        1   0.5
...
10 10    a           A24   10     box      TRUE Helvetica        1   0.5
...
13 13    b Contamination   13 polygon      TRUE Helvetica        1   1.0

    style color  fillcolor fontcolor sides  x  y
1  filled black SandyBrown     black    NA NA NA
...
10 filled black SandyBrown     black    NA NA NA
...
13 filled black        tan     black     6 18 43

Я также использовал nudge_node_positions_ws, но узлы не двигаются. Я считаю, что это связано с layout = "tree", которое не позволяет узлам двигаться. Как я могу заставить узлы двигаться? Я также думаю, что я мог бы передать кадры данных в digraph или Graphviz (например, http://www.graphviz.org/pdf/dotguide.pdf), но я пока не знаю, необходимо ли это или как это сделать. Есть ли способ переместить узлы, используя DigrammeR в макете дерева и дублировать группу узлов, чтобы они появлялись слева и справа? Кроме того, я хотел бы сохранить порядок узлов постоянным, но не понимаю, как это определяется (в алфавитном порядке или значение данных?).

Спасибо!

...