plot_heatmap_internal <- function( methy_data, pos_style, subsample, group_col = "group" ) { # subsample reads down to a certain number of read groups subsample_groups <- function(x, key, subsample) { if (nrow(x) > subsample) { x <- dplyr::sample_n(x, subsample) } x } methy_data <- methy_data %>% dplyr::nest_by(group = .data[[group_col]], read_group = .data$read_group) %>% dplyr::group_by(.data$group) %>% dplyr::group_modify(subsample_groups, subsample = subsample) methy_data <- tidyr::unnest(methy_data, "data") read_data <- methy_data %>% dplyr::group_by(.data$read_name) %>% dplyr::summarise(start = min(.data$pos), end = max(.data$pos)) %>% dplyr::inner_join( dplyr::select(methy_data, "read_name", "read_group", "group"), by = "read_name" ) if (pos_style == "compact") { # only plots sites with measured modification, evenly spaced p <- ggplot2::ggplot( methy_data, aes( x = factor(.data$pos), y = .data$read_group, fill = .data$mod_prob ) ) + ggplot2::geom_raster() + heatmap_fill_scale + ggplot2::facet_wrap(~group, scales = "free_y", ncol = 1, strip.position = "right") + theme_methy_heatmap + ggplot2::theme( axis.ticks.x = ggplot2::element_blank(), axis.text.x = ggplot2::element_blank(), ) + ggplot2::xlab("Site") } else if (pos_style == "to_scale") { # plots all sites in range, evenly spaced with square geoms # data will overlap p <- ggplot2::ggplot(methy_data, aes(y = .data$read_group)) + ggplot2::geom_errorbarh( ggplot2::aes( xmin = .data$start, xmax = .data$end ), data = read_data, alpha = 1, color = "darkgray", linewidth = 0.8, height = 0 ) + ggplot2::geom_point( aes(x = .data$pos, col = .data$mod_prob), alpha = 1, shape = 15) + heatmap_col_scale + ggplot2::facet_wrap(~group, scales = "free_y", ncol = 1, strip.position = "right") + theme_methy_heatmap + ggplot2::xlab("Position") } p }