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

Adjusting “Intersection size” to display the percentage of each group when the bars are filled #187

Open
richardstoeckl opened this issue Nov 16, 2023 · 0 comments
Labels
help-request User requested help with the package

Comments

@richardstoeckl
Copy link

richardstoeckl commented Nov 16, 2023

Hello and thank you so much for this great package!

Objective
I am trying to create a plot, very similar to the ones shown in this part of the tutorial and mentioned in #103 . However, instead of the number (count), I want to show the percentage of each group in the stacked Intersection size bars (see images below). This way, one could easily see if a reduced amount of counts of a given intersection is just a consequence of a reduced amount of total entries of that group.

Sadly I was unable to do this with the sections mentioned in your reply here, as the !!aes_percentage(relative_to='group') directive does not seem to work within the intersection_size() function. And the text_mapping=aes(label=!!upset_text_percentage()) way of displaying the percentages does not split them by the stacked bar plot groups.

Is there a way to do this that I am overlooking?

Thank you so much

  • RIchard

Code

library(tidyverse)
library(ComplexUpset)

# use data from tutorial
movies = as.data.frame(ggplot2movies::movies)
genres = colnames(movies)[18:24]
movies[genres] = movies[genres] == 1
movies[movies$mpaa == '', 'mpaa'] = NA

# for cleaner visualisation, split data into two groups ("released before 2000 and after")
movies = na.omit(movies) %>% mutate(pre2000=if_else(year<= 2000,"old","new"))

plot <- upset(movies,
              genres,
              width_ratio=0.1,
              min_size = 0,
              wrap = T,
              mode = "distinct",
              base_annotations=list(
                  'Intersection size'=intersection_size(
                      counts=F,
                      mapping=aes(fill=pre2000)
                  ) + 
                   stat_summary(fun=sum,
                                geom='text',
                                position=position_stack(vjust = 0.5),
                                aes(label=after_stat(y)), color = "white") +
                  theme(legend.position = "top", legend.title = element_blank())
              ),
              annotations =list(
                  'Percentage of Group'=list(
                      aes=aes(x=intersection, fill=pre2000),
                      geom=list(
                          geom_bar(stat='count', position='fill', na.rm=TRUE),
                          geom_text(
                              aes(
                                  label=!!aes_percentage(relative_to='group'),
                                  group = pre2000
                              ),
                              stat='count',
                              position=position_fill(vjust = .5)
                          ),
                          scale_y_continuous(labels=scales::percent_format())
                      )
                  )
              ),
              set_sizes=(
                  upset_set_size(
                      geom=geom_bar(
                          aes(fill=pre2000, x=group),
                          width=0.8, show.legend = FALSE
                      ) 
                  )
              )
              ) 
plot

Screenshot or illustration
This is the closest I could get with the code above:
percentageOfGroup_image1

And this is to show what I want to achieve:
percentageOfGroup_image2

Context (required)

ComplexUpset version: 1.3.3

R version details
$platform
[1] "x86_64-apple-darwin17.0"

$arch
[1] "x86_64"

$os
[1] "darwin17.0"

$system
[1] "x86_64, darwin17.0"

$status
[1] ""

$major
[1] "4"

$minor
[1] "2.2"

$year
[1] "2022"

$month
[1] "10"

$day
[1] "31"

$`svn rev`
[1] "83211"

$language
[1] "R"

$version.string
[1] "R version 4.2.2 (2022-10-31)"

$nickname
[1] "Innocent and Trusting"
R session information
R version 4.2.2 (2022-10-31)
Platform: x86_64-apple-darwin17.0 (64-bit)
Running under: macOS 14.1.1

Matrix products: default
LAPACK: /Library/Frameworks/R.framework/Versions/4.2/Resources/lib/libRlapack.dylib

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

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

other attached packages:
 [1] ComplexUpset_1.3.3 lubridate_1.9.3    forcats_1.0.0      stringr_1.5.0      dplyr_1.1.3        purrr_1.0.2        readr_2.1.4        tidyr_1.3.0       
 [9] tibble_3.2.1       ggplot2_3.4.4      tidyverse_2.0.0   

loaded via a namespace (and not attached):
 [1] pillar_1.9.0        compiler_4.2.2      tools_4.2.2         lifecycle_1.0.3     gtable_0.3.4        timechange_0.2.0    pkgconfig_2.0.3    
 [8] rlang_1.1.2         cli_3.6.1           rstudioapi_0.15.0   patchwork_1.1.3     withr_2.5.2         generics_0.1.3      fs_1.6.3           
[15] vctrs_0.6.4         ggplot2movies_0.0.1 hms_1.1.3           grid_4.2.2          tidyselect_1.2.0    glue_1.6.2          R6_2.5.1           
[22] fansi_1.0.5         tzdb_0.4.0          farver_2.1.1        magrittr_2.0.3      scales_1.2.1        colorspace_2.1-0    labeling_0.4.3     
[29] utf8_1.2.4          stringi_1.7.12      munsell_0.5.0       crayon_1.5.2      
@richardstoeckl richardstoeckl added the help-request User requested help with the package label Nov 16, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
help-request User requested help with the package
Projects
None yet
Development

No branches or pull requests

1 participant