My understanding is that ggraph()
plots edges in the order in which they appear in the edges
data frame of a tidygraph object (or in the edge sequence of an igraph object). So the order in which edges are plotted can be changed by setting/changing the order of edges in the data frame (for example, via dplyr::arrange()
) or igraph object. Yet for some reason this is not working with geom_edge_link()
in the reprex below. I arrange edges in the original data frame (and resulting igraph and tidygraph objects) so that edges of type "ego.alter"
come first. However, they are not drawn first (i.e., underneath all other edges) by ggraph()
. Note that they are correctly drawn first by plot.igraph()
instead.
What’s wrong in the code? Am I missing something?
# Reproduce graph
elist <- tribble(
~from, ~to, ~edge.type,
"11027262", "15042670", "alter.alter",
"11027262", "15142510", "alter.alter",
"11027262", "121174595", "alter.alter",
"11027262", "126253219", "alter.alter",
"15042670", "126253219", "alter.alter",
"24083363", "461719865", "alter.alter",
"37495679", "63923254", "alter.alter",
"37495679", "296699903", "alter.alter",
"37495679", "461719865", "alter.alter",
"37495679", "497757255", "alter.alter",
"24083363", "63923254", "alter.alter",
"63923254", "83492849", "alter.alter",
"63923254", "296699903", "alter.alter",
"83492849", "296699903", "alter.alter",
"15042670", "121174595", "alter.alter",
"15142510", "121174595", "alter.alter",
"121174595", "126253219", "alter.alter",
"15142510", "126253219", "alter.alter",
"126253219", "254860469", "alter.alter",
"296699903", "461719865", "alter.alter",
"461719865", "497757255", "alter.alter",
"126253219", "ego", "ego.alter",
"497757255", "ego", "ego.alter",
"254860469", "ego", "ego.alter",
"15042670", "ego", "ego.alter",
"121174595", "ego", "ego.alter",
"391171732", "ego", "ego.alter",
"63923254", "ego", "ego.alter",
"83492849", "ego", "ego.alter",
"462525753", "ego", "ego.alter",
"11027262", "ego", "ego.alter",
"461719865", "ego", "ego.alter",
"296699903", "ego", "ego.alter",
"24083363", "ego", "ego.alter",
"15142510", "ego", "ego.alter",
"37495679", "ego", "ego.alter"
)
# Rearrange edges based on edge.type
elist <- elist |>
arrange(desc(edge.type))
# Convert to igraph
gr <- graph_from_data_frame(d = elist, directed = FALSE)
# Check order of edges on "edge.type" attribute: order is correct (ego.alter edges first)
E(gr)$edge.type
# Now ego.alter edges are correctly plotted before (i.e. underneath) alter-alter edges.
E(gr)$color <- "black"
E(gr)[edge.type == "ego.alter"]$color <- "red"
set.seed(293)
plot(gr, vertex.size = 3, vertex.label = NA, edge.width = 3)
Correct plot with plot.igraph()
(red edges underneath all black edges):
# But with ggraph, ego.alter edges are NOT plotted correctly: some are before (underneath),
# others are after (on top of) alter.alter edges.
set.seed(293)
ggraph(gr, layout = "fr") +
geom_edge_link(aes(color = edge.type), width = 1.5) +
geom_node_point(size = 2.5) +
scale_edge_color_manual(values = c(alter.alter = "black", ego.alter = "red")) +
labs(edge_color = "Edge type", shape = "Node type") +
coord_fixed() +
theme_graph()
# The same happens when applying ggraph() to the tidygraph object.
# Get tidygraph object
tblgr <- tbl_graph(edges = elist, directed = FALSE)
# Check order of edges on "edge.type" attribute: order is correct (ego.alter edges first)
tblgr |>
activate(edges) |>
as_tibble() |>
print(n = Inf)
# Plot
set.seed(230)
ggraph(tblgr, layout = "fr") +
geom_edge_link(aes(color = edge.type), width = 1.5) +
geom_node_point(size = 2.5) +
scale_edge_color_manual(values = c(alter.alter = "black", ego.alter = "red")) +
labs(edge_color = "Edge type", shape = "Node type") +
coord_fixed() +
theme_graph()
Wrong plot with ggraph()
(some red edges underneath, some on top of black edges):