`geom_conn_bundle()` crashes R
ramiromagno opened this issue · 8 comments
ramiromagno commented
Hi Thomas,
Using ggraph version 2.1.0.9000 (devel. version), this example code from the R Graph Gallery crashes R:
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 commented
Thanks - I can reproduce
thomasp85 commented
huh, weird - and now I can't... Maybe the other crash I experienced was unrelated
thomasp85 commented
is the crash still reproducible on your system with latest versions installed?
ramiromagno commented
I will try and let you know.
ramiromagno commented
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 commented
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 commented
Interesting. Do you have access to a non-Linux system to test this on?
ramiromagno commented
Yes, I can get my hands on a macos. I will let you know.