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

[R包分享] ggalign实现轴对齐与图表布局的工具 #6038

Closed
ixxmu opened this issue Nov 25, 2024 · 1 comment
Closed

[R包分享] ggalign实现轴对齐与图表布局的工具 #6038

ixxmu opened this issue Nov 25, 2024 · 1 comment

Comments

@ixxmu
Copy link
Owner

ixxmu commented Nov 25, 2024

https://mp.weixin.qq.com/s/N6p-B7K-5Okkagnknc9pZQ

@ixxmu
Copy link
Owner Author

ixxmu commented Nov 25, 2024

[R包分享] ggalign实现轴对齐与图表布局的工具 by R语言数据分析指南

欢迎关注R语言数据分析指南

本节来介绍一款新的R包ggalign,该包作为ggplot的扩展包主要实现轴对齐与图表布局方面的功能增强,内容非常的丰富。下面小编通过两个案例来展示一下具体功能,更多详细内容请参考作者官方文档。

官方文档

https://yunuuuu.github.io/ggalign/dev/

拼图功能

各种布局方式

案例1

library(tidyverse)
install.packages("ggalign")
library(ggalign)
library(patchwork)
# 构建数据
set.seed(123)
small_mat <- matrix(rnorm(56), nrow = 7)
rownames(small_mat) <- paste0("row", seq_len(nrow(small_mat)))
colnames(small_mat) <- paste0("column", seq_len(ncol(small_mat)))

ggplot绘图方式

p1 <- ggplot(aes(name,id,fill=value),data=df) +
  geom_tile()+
  theme(axis.text.x=element_text(angle=45,vjust=1,hjust=1),
        axis.title =element_blank(),
        axis.ticks = element_blank()) 

p2 <- ggplot(aes(value,id,fill="red"),data=df) +
  geom_col(show.legend = F)+
  theme(axis.text.y=element_blank(),
        axis.ticks.y = element_blank(),
        axis.title =element_blank(),
        axis.line.x=element_line())

library(patchwork)
(p1+p2)+plot_layout(guides = 'collect')

ggalign水平布局方式

df <- small_mat %>% as.data.frame() %>% 
  rownames_to_column(var="id") %>% pivot_longer(-id)

stack_alignh() +
  ggfree(aes(name,id,fill=value),data=df) +
  geom_tile()+
  theme(axis.text.x=element_text(angle=45,vjust=1,hjust=1),
        axis.title =element_blank(),
        axis.ticks = element_blank()) +
  ggfree(aes(value,id,fill="red"),data=df) +
  geom_col(show.legend = F)+
  theme(axis.text.y=element_blank(),
        axis.ticks.y = element_blank(),
        axis.title =element_blank(),
        axis.line.x=element_line())

同样一个图使用了ggalign的水平布局后可以去掉图形的中间变量保存,不在通过单独拼图的步骤一段代码出图。free_gg()的别名是ggfree,该函数允许您将 ggplot 对象合并到布局中。与align_gg()精确对齐每个轴值的 不同,free_gg()更侧重于布局集成,而不强制执行严格的轴对齐。

案例2复杂热图

expr <- read_example("gene_expression.rds")
mat <- as.matrix(expr[, grep("cell", colnames(expr))])
base_mean <- rowMeans(mat)
mat_scaled <- t(apply(mat, 1, scale))
type <- gsub("s\\d+_""", colnames(mat))

stack_alignh(mat_scaled) +
    stack_active(sizes = c(0.211)) +
    # group stack rows into 5 groups
    align_kmeans(centers = 5L) +
    # add a block plot for each group in the stack
    ggalign(size = unit(1"cm"), data = NULL) +
    geom_tile(aes(x = 1, fill = factor(.panel))) +
    scale_fill_brewer(palette = "Dark2", name = "Kmeans group") +
    scale_x_continuous(breaks = NULL, name = NULL) +
    # add a heatmap plot in the stack
    ggheatmap() -
    plot_align(free_spaces = "l") +
    scale_y_continuous(breaks = NULL) +
    scale_fill_viridis_c(option = "magma") +
    # add dendrogram for this heatmap
    anno_top() +
    align_dendro() +
    # add a block for the heatmap column
    ggalign(data = type, size = unit(1"cm")) +
    geom_tile(aes(y = 1, fill = factor(value))) +
    scale_y_continuous(breaks = NULL, name = NULL) +
    scale_fill_brewer(
        palette = "Set1", name = "type",
        guide = guide_legend(position = "top")
    ) +
    # add another heatmap in the stack and set the heatmap body width
    ggheatmap(base_mean, width = unit(2"cm")) +
    scale_y_continuous(breaks = NULL) +
    scale_x_continuous(name = "base mean", breaks = FALSE) +
    scale_fill_gradientn(colours = c("#2600D1FF""white""#EE3F3FFF")) +
    # set the active context of the heatmap to the top
    # and set the size of the top stack
    anno_top(size = unit(4"cm")) +
    # add box plot in the heatmap top
    ggalign() +
    geom_boxplot(aes(y = value, fill = factor(.extra_panel))) +
    scale_x_continuous(expand = expansion(), breaks = NULL) +
    scale_fill_brewer(
        palette = "Dark2", name = "base mean",
        guide = guide_legend(position = "top")
    ) +
    theme(axis.title.y = element_blank()) +
    # we move into the stack layout
    stack_active() +
    # add a point plot
    ggalign(data = expr$length, size = unit(2"cm")) +
    geom_point(aes(x = value)) +
    labs(x = "length") +
    theme(
        panel.border = element_rect(fill = NA),
        axis.text.x = element_text(angle = -60, hjust = 0)
    ) +
    # add another heatmap and set the heatmap body width
    ggheatmap(expr$type, width = unit(2"cm")) +
    scale_fill_brewer(palette = "Set3", name = "gene type") +
    scale_x_continuous(breaks = NULL, name = "gene type") +
    # add barplot in the top annotation, and remove the spaces in the y-axis
    anno_top() -
    plot_align(free_spaces = "lr") +
    ggalign(limits = FALSE) +
    geom_bar(
        aes(.extra_panel, fill = factor(value)),
        position = position_fill()
    ) +
    scale_y_continuous(expand = expansion()) +
    scale_fill_brewer(palette = "Set3", name = "gene type", guide = "none") -
    plot_theme(plot.margin = margin()) &
    theme(
        plot.background = element_blank(), panel.background = element_blank(),
        legend.background = element_blank()
    )

关注下方公众号下回更新不迷路

ggalign包的内容很多,上面两个案例只是介绍了其冰山一角,更多详细的内容可参考作者官方文档。本节介绍到此结束,有需要学习R数据可视化的朋友欢迎到淘宝店铺:R语言数据分析指南,购买小编的R语言可视化文档(2024版),购买将赠送2023年的绘图文档内容。目前此文档(2023+2024)已经更新上传200案例文档,2024更新的绘图内容将同时包含数据+代码+注释文档+文档清单,2023无目录仅有数据文件夹,小编只分享案例文档,不额外回答问题,无答疑服务,零基础不推荐买。

案例特点

所选案例图均属于个性化分析图表完全适用于论文发表,内容异常丰富两年累计发布案例图200+,2024年6月起提供html版注释文档更加直观易学。文档累计上千人次购买拥有良好的社群交流体验。R代码结构清晰易懂,为防止中文乱码提供单独的注释文档

R代码结构清晰易懂,为防止中文乱码2024年6月起提供单独html注释文档

群友精彩评论

淘宝店铺

2024年已更新案例图展示


@ixxmu ixxmu changed the title archive_request [R包分享] ggalign实现轴对齐与图表布局的工具 Nov 25, 2024
@ixxmu ixxmu closed this as completed Nov 25, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant