最近要复现一个图:

    26. 求助!请问你会画dodge, stack 图吗? - 图1

    对于练习时常三周半的我来说,这还不简单?

    但当我摇摆在fill 指定多个属性以及position 是dodge 还是stack 间时,现实给了我狠狠的一记耳光。正如有个说的:

    1. ggplot2 is powerful but opinionated software- sometimes it is the ggplot way or no way at all. Sharpie Jul 18 '10 at 19:32

    这可真是离谱妈妈给离谱开门,离谱到家了。

    于是我退而求其次,按照https://stackoverflow.com/questions/12715635/ggplot2-bar-plot-with-both-stack-and-dodge 建议,选择了facet。

    26. 求助!请问你会画dodge, stack 图吗? - 图2

    有个参数可以解决这个问题scales = “free”:

    1. (p1 <- ggplot(snv_df) + theme_classic() +
    2. geom_bar(aes(Tumor_Sample_Barcode, fill = Variant_Type)) +
    3. theme(
    4. panel.grid = element_blank(),
    5. axis.text.x = element_blank(),
    6. axis.ticks.x = element_blank(),
    7. axis.line.x = element_blank()) +
    8. labs(x = "") + scale_y_continuous(expand=c(0,0)) +
    9. scale_x_discrete(expand = expansion(mult = c(0.03,0)))) +
    10. facet_grid(.~Patient_Barcode,scales = "free")

    26. 求助!请问你会画dodge, stack 图吗? - 图3

    free 让每个数据都有自己的数据表现,而space 则可以让每个数据有自己独立的坐标系:

    1. (p1 <- ggplot(snv_df) + theme_classic() +
    2. geom_bar(aes(Tumor_Sample_Barcode, fill = Variant_Type)) +
    3. theme(
    4. panel.grid = element_blank(),
    5. axis.text.x = element_blank(),
    6. axis.ticks.x = element_blank(),
    7. axis.line.x = element_blank()) +
    8. labs(x = "") + scale_y_continuous(expand=c(0,0)) +
    9. scale_x_discrete(expand = expansion(mult = c(0.03,0)))) +
    10. facet_grid(.~Patient_Barcode, scales = "free", space = "free")

    26. 求助!请问你会画dodge, stack 图吗? - 图4

    然而这样又有新的问题了,分面的注释无法显示完全名称。

    这时候我们可以通过strip 修改一下分面注释对象,让其无背景,并且垂直显示:

    1. (p1 <- ggplot(snv_df) + theme_classic() +
    2. geom_bar(aes(Tumor_Sample_Barcode, fill = Variant_Type)) +
    3. theme(
    4. panel.grid = element_blank(),
    5. axis.text.x = element_blank(),
    6. axis.ticks.x = element_blank(),
    7. axis.line.x = element_blank(),
    8. axis.title = element_text(size = 18),
    9. axis.text = element_text(size = 14),
    10. legend.title = element_blank(),
    11. legend.text = element_text(size = 12)) +
    12. theme(strip.background = element_blank(),
    13. strip.text.x = element_text(angle = 90, size = 12)) +
    14. labs(x = "") + scale_y_continuous(expand=c(0,0)) +
    15. scale_x_discrete(expand = expansion(mult = c(0.03,0)))) +
    16. facet_grid(.~Patient_Barcode, scales = "free", space = "free")

    26. 求助!请问你会画dodge, stack 图吗? - 图5

    接下来就是让facet 的内容从默认的top 变到底部,“假装”它是通过aes 分组出来的内容:

    1. (p1 <- ggplot(snv_df) + theme_classic() +
    2. geom_bar(aes(Tumor_Sample_Barcode, fill = Variant_Type)) +
    3. theme(
    4. panel.grid = element_blank(),
    5. axis.text.x = element_blank(),
    6. axis.ticks.x = element_blank(),
    7. axis.line.x = element_blank(),
    8. axis.title = element_text(size = 18),
    9. axis.text = element_text(size = 14),
    10. legend.title = element_blank(),
    11. legend.text = element_text(size = 12),
    12. legend.position = c(.7, .97),
    13. legend.background = element_rect(fill = "transparent")) +
    14. theme(strip.background = element_blank(),
    15. strip.text.x = element_text(angle = 90, size = 10, face = "bold")) +
    16. labs(x = "") + scale_y_continuous(expand=c(0,0)) +
    17. scale_x_discrete(expand = expansion(mult = c(0.03,0)))) +
    18. theme(legend.spacing.x = unit(.5, 'cm')) +
    19. guides(fill = guide_legend(direction = "horizontal")) +
    20. facet_grid(.~Patient_Barcode, scales = "free", space = "free", switch = "x")

    26. 求助!请问你会画dodge, stack 图吗? - 图6

    再美化一下:

    1. (p2 <- p1 + scale_fill_paletteer_d("ggsci::default_nejm") +
    2. theme(legend.background = element_rect(fill = "white",
    3. color = "gray60"),
    4. panel.background = element_rect(fill = "#d5e4eb"),
    5. plot.background = element_rect(fill = "#d5e4eb"))
    6. )

    26. 求助!请问你会画dodge, stack 图吗? - 图7