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

geom_conn_bundle() crashes R #350

Open
ramiromagno opened this issue Aug 24, 2023 · 8 comments
Open

geom_conn_bundle() crashes R #350

ramiromagno opened this issue Aug 24, 2023 · 8 comments
Labels

Comments

@ramiromagno
Copy link

Hi Thomas,

Using ggraph version 2.1.0.9000 (devel. version), this example code from the R Graph Gallery crashes R:

snap

From my quick inspection it seems that geom_conn_bundle() is the culprit.

Here is the code:

library(ggraph)
library(igraph)
library(tidyverse)
library(RColorBrewer)

# create a data frame giving the hierarchical structure of your individuals
set.seed(1234)
d1 <- data.frame(from="origin", to=paste("group", seq(1,10), sep=""))
d2 <- data.frame(from=rep(d1$to, each=10), to=paste("subgroup", seq(1,100), sep="_"))
edges <- rbind(d1, d2)

# create a dataframe with connection between leaves (individuals)
all_leaves <- paste("subgroup", seq(1,100), sep="_")
connect <- rbind(
  data.frame( from=sample(all_leaves, 100, replace=T) , to=sample(all_leaves, 100, replace=T)),
  data.frame( from=sample(head(all_leaves), 30, replace=T) , to=sample( tail(all_leaves), 30, replace=T)),
  data.frame( from=sample(all_leaves[25:30], 30, replace=T) , to=sample( all_leaves[55:60], 30, replace=T)),
  data.frame( from=sample(all_leaves[75:80], 30, replace=T) , to=sample( all_leaves[55:60], 30, replace=T)) )
connect$value <- runif(nrow(connect))

# create a vertices data.frame. One line per object of our hierarchy
vertices  <-  data.frame(
  name = unique(c(as.character(edges$from), as.character(edges$to))) ,
  value = runif(111)
)
# Let's add a column with the group of each name. It will be useful later to color points
vertices$group  <-  edges$from[ match( vertices$name, edges$to ) ]



#Let's add information concerning the label we are going to add: angle, horizontal adjustement and potential flip
#calculate the ANGLE of the labels
vertices$id <- NA
myleaves <- which(is.na( match(vertices$name, edges$from) ))
nleaves <- length(myleaves)
vertices$id[ myleaves ] <- seq(1:nleaves)
vertices$angle <- 90 - 360 * vertices$id / nleaves

# calculate the alignment of labels: right or left
# If I am on the left part of the plot, my labels have currently an angle < -90
vertices$hjust <- ifelse( vertices$angle < -90, 1, 0)

# flip angle BY to make them readable
vertices$angle <- ifelse(vertices$angle < -90, vertices$angle+180, vertices$angle)



# Create a graph object
mygraph <- igraph::graph_from_data_frame( edges, vertices=vertices )

# The connection object must refer to the ids of the leaves:
from  <-  match( connect$from, vertices$name)
to  <-  match( connect$to, vertices$name)

# Basic usual argument
ggraph(mygraph, layout = 'dendrogram', circular = TRUE) +
  geom_node_point(aes(filter = leaf, x = x*1.05, y=y*1.05)) +
  geom_conn_bundle(data = get_con(from = from, to = to), alpha=0.2, colour="skyblue", width=0.9) +
  geom_node_text(aes(x = x*1.1, y=y*1.1, filter = leaf, label=name, angle = angle, hjust=hjust), size=1.5, alpha=1) +
  theme_void() +
  theme(
    legend.position="none",
    plot.margin=unit(c(0,0,0,0),"cm"),
  ) +
  expand_limits(x = c(-1.2, 1.2), y = c(-1.2, 1.2))

My session info:

R version 4.3.1 (2023-06-16)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Arch Linux

Matrix products: default
BLAS:   /usr/lib/libblas.so.3.11.0 
LAPACK: /usr/lib/liblapack.so.3.11.0

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C               LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8    LC_PAPER=en_US.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C             LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

time zone: Europe/Lisbon
tzcode source: system (glibc)

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
 [1] igraph_1.5.1      tidyr_1.3.0       R6_2.5.1          utf8_1.2.3        lubridate_1.9.2   tidyselect_1.2.0 
 [7] magrittr_2.0.3    glue_1.6.2        tibble_3.2.1      pkgconfig_2.0.3   timechange_0.2.0  generics_0.1.3   
[13] dplyr_1.1.2       lifecycle_1.0.3   cli_3.6.1         fansi_1.0.4       vctrs_0.6.3       compiler_4.3.1   
[19] rprojroot_2.0.3   here_1.0.1        purrr_1.0.1       rstudioapi_0.15.0 tools_4.3.1       tidygraph_1.2.3  
[25] pillar_1.9.0      rlang_1.1.1      
@thomasp85 thomasp85 added the bug label Jan 8, 2024
@thomasp85
Copy link
Owner

Thanks - I can reproduce

@thomasp85
Copy link
Owner

huh, weird - and now I can't... Maybe the other crash I experienced was unrelated

@thomasp85
Copy link
Owner

is the crash still reproducible on your system with latest versions installed?

@ramiromagno
Copy link
Author

I will try and let you know.

@ramiromagno
Copy link
Author

Indeed, still crashes.

reprex::reprex({...}, std_out_err = TRUE)

This reprex appears to crash R.
See standard output and standard error for more details.

Standard output and error

/usr/include/c++/13.1.1/bits/stl_vector.h:1125: std::vector<_Tp, _Alloc>::reference std::vector<_Tp, _Alloc>::operator[](size_type) [with _Tp = Point; _Alloc = std::allocator<Point>; reference = Point&; size_type = long unsigned int]: Assertion '__n < this->size()' failed.

@ramiromagno
Copy link
Author

packageVersion("ggraph")
#> [1] '2.1.0.9000'
packageVersion("igraph")
#> [1] '1.5.1'
packageVersion("tidyverse")
#> [1] '2.0.0'
packageVersion("RColorBrewer")
#> [1] '1.1.3'

@thomasp85
Copy link
Owner

Interesting. Do you have access to a non-Linux system to test this on?

@ramiromagno
Copy link
Author

Yes, I can get my hands on a macos. I will let you know.

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

No branches or pull requests

2 participants