Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Plotting behaviour of factor levels with geom_edge_link() #279

Closed
jlguilherme opened this issue Jan 27, 2021 · 2 comments
Closed

Plotting behaviour of factor levels with geom_edge_link() #279

jlguilherme opened this issue Jan 27, 2021 · 2 comments

Comments

@jlguilherme
Copy link

Hi - great package! Thanks!

I'm having an issue with the order edges are plotted with geom_edge_link() - I need them to respect the order of factor levels (factor cat below) and to have different widths according to value in strength.

I would expect edges to be plotted in "order" they appear in the edge list that feeds tbl_graph but that does not seem to be the case - what should be the expected behaviour?

Consider the following dataframe
from <- c("A","A","A","A","A","B","B","B","B","B","C","C","D","D","D","D","D","D","D","D","E","E","E","E","E","F","F","G","G","G","G","G","G")
to <- c("H","I","I","J","O","O","H","I","I","N","N","H","N","J","H","J","J","I","I","J","L","N","J","L","H","L","H","M","J","N","I","H","H")
cat <- c("weak","moderate","strong","v_strong","weak","moderate","strong","v_strong","weak","moderate","strong","v_strong","weak","weak","weak","weak","weak","weak","moderate","strong","v_strong","moderate","moderate","moderate","moderate","strong","v_strong","weak","weak","weak","weak","strong","v_strong")
strength <- c(0.7,1,0.4,0.9,0,0,0.2,0.4,0.2,0.6,0.5,0.3,1,0.5,0.6,0.2,0.5,0.7,1,0,0.2,0.8,0.5,0.4,0.1,0,0.7,0.2,0.5,0.7,0.3,0.4,0.6)

df <- data.frame(from, to, cat, strength)
Order the level in factor 'cat'
df$cat <- factor(df$cat, levels = c("weak", "moderate", "strong", "v_strong"))

levels(df$cat)

[1] "weak"     "moderate" "strong"   "v_strong"

edge list

edge.list <- df

node list

n.from <- df %>%
   group_by(from) %>%
   summarise(n = n()) %>%
   rename(name = from)
 
n.to <- df %>%
  group_by(to) %>%
  summarise(n = n()) %>%
  rename(name = to)
 
node.list <- rbind(n.from, n.to)

tbl_graph file

Netw <- tbl_graph(nodes = node.list, edges = edge.list)

plot it!

ggraph(Netw) +
geom_edge_link(aes(edge_colour = cat, width = strength)) +
scale_edge_width_continuous(limits = c(0,1), range=c(.1,2.5)) +
scale_edge_colour_manual(values = c("moderate" = "grey80", "weak" = "red", "v_strong" = "#3E1404", "strong" = "#9F6B39"))

I get this:

Rplot01

However, I would expect the red edges (i.e. level "weak") to be in the 'back' and over all the other edges.

I tried different things but just don't understand if this is the expected behaviour and how I can obtain my desired output.

Thanks for your help!

@brooksambrose
Copy link

I admit to some confusion to the edge order of drawing, but in your case the simple fix is to use the group aesthetic:

ggraph(Netw) +
geom_edge_link(aes(edge_colour = cat, width = strength,group=cat)) +
scale_edge_width_continuous(limits = c(0,1), range=c(.1,2.5)) +
scale_edge_colour_manual(values = c("moderate" = "grey80", "weak" = "red", "v_strong" = "#3E1404", "strong" = "#9F6B39"))

image

@brooksambrose
Copy link

Fwiw I have found that only geom_edge_link2 respects the ordering of a factor variable. If the values of an edge are factors you can control the order in which the edges are drawn by setting the order of the factor levels, but again only for geom_edge_link2.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants