Я создаю концептуальную модель, которая включает в себя:
- Действия
- Прямые эффекты
- Косвенные эффекты
- Ценные компоненты
Действия связаны с прямыми и косвенными эффектами, связанными с оцениваемыми компонентами. Края создают много трафика 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 для прямого воздействия
Я планирую объединить графики:
- Действия с прямыми эффектами
- Прямые эффекты с ценными компонентами
- Действия с косвенными эффектами
- Косвенные эффекты для оцениваемых компонентов
Я надеюсь, что смогу продублировать узлы оцениваемого компонента, чтобы они появлялись с левой и правой стороны, как я иллюстрировал выше. Однако проблема, с которой я сталкиваюсь, заключается в расстоянии между узлами прямого эффекта - они соприкасаются, и это приводит к визуальному траффику 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 в макете дерева и дублировать группу узлов, чтобы они появлялись слева и справа? Кроме того, я хотел бы сохранить порядок узлов постоянным, но не понимаю, как это определяется (в алфавитном порядке или значение данных?).
Спасибо!