美文网首页
小提琴图之ggplot_split_violin()及gghal

小提琴图之ggplot_split_violin()及gghal

作者: 夕颜00 | 来源:发表于2021-12-09 16:34 被阅读0次
    image image

    参考

    代码来源Split Violin Plot for ggplot2 · GitHub
    关注我们的公众号,可见详细复现Fancy violin (qq.com)

    实战

    我首先找到一个合适的颜色,并且定义了自己的作图主题

    library(ggplot2)
    library(ggsci)
    library(ggpubr)
    library(scales)
    
    ###自定义颜色
    mypal=pal_simpsons(alpha = .6)(9)
    mypal[c(1,7)]
    show_col(mypal)
    show_col(mypal[c(1,7)])
    
    ###自定义主题
    mytheme <- theme(axis.text.x=element_text(size=12), 
                     axis.text.y=element_text(size=12), 
                     axis.title=element_text(size = 13), 
                     legend.text=element_text(size=12),
                     legend.title=element_text(size=12),
                     axis.line = element_line(size=0.7), 
                     panel.border = element_blank(),
                     panel.grid = element_blank())
    
    

    方法一

    image
    ###数据生成
    cell <- rep(LETTERS[1:10],400)
    sp <- rep(c("normal","tumor"),time=c(2000,2000))
    value <- c(rnorm(2000)+1,rnorm(2000)+2)
    df <- data.frame(cell=cell,sample=sp,value=value)
    > head(df)
      cell sample      value
    1    A normal  0.3682008
    2    B normal  1.4030093
    3    C normal -0.8951433
    4    D normal  1.2949975
    5    E normal  2.0451915
    6    F normal  1.6834365
    ###作图
    ggplot(df,aes(x=cell,y = value,fill=sample))+
      geom_split_violin(trim = T,colour=NA)+
      geom_point(stat = 'summary',fun=mean,
                 position = position_dodge(width = 0.9))+
      scale_fill_manual(values = c("#197EC099","#FED43999"))+
      stat_summary(fun.min = function(x){quantile(x)[2]},
                   fun.max = function(x){quantile(x)[4]},
                   geom = 'errorbar',color='black',
                   width=0.01,size=0.5,
                   position = position_dodge(width = 0.9))+
      theme_bw()+
      mytheme+
      ylab("Value")+xlab("Type")
    
    

    方法二

    image
    ggplot()+
      geom_half_violin(
        data = df %>% filter(sample=="normal"),
        aes(x = cell,y = value),colour=NA,fill="#197EC099",side = "l"
      )+
      geom_half_violin(
        data = df %>% filter(sample=="tumor"),
        aes(x = cell,y = value),colour=NA,fill="#FED43999",side = "r"
      )+
      mytheme+
      theme_bw()+
      ylab("Value")+xlab("Type")+
      geom_point(data = df,aes(x=cell,y = value,fill=sample),
                 stat = 'summary',fun=mean,
                 position = position_dodge(width = 0.7))+
      stat_summary(data = df,aes(x=cell,y = value,fill=sample),
                   fun.min = function(x){quantile(x)[2]},
                   fun.max = function(x){quantile(x)[4]},
                   geom = 'errorbar',color='black',
                   width=0.01,size=0.5,
                   position = position_dodge(width = 0.7))+
      stat_compare_means(data = df,aes(x=cell,y = value,fill=sample),label = 'p.signif')
    
    

    总的来说,两种方法得到的结果一样,方法一依赖包装好的函数,方法二较为成熟,可以直接使用gghalves包。

    GGHALVES包

    描述

    这里主要介绍这个包中的geom_half_violin()函数,它相当于geom_violin()函数的变体,因为这个函数主要作用就是展示一半的小提琴图,然后与其他图形组合。

    使用

    geom_half_violin(mapping = NULL, data = NULL, stat = "half_ydensity",
      position = "dodge", ..., side = "l", nudge = 0,
      draw_quantiles = NULL, trim = TRUE, scale = "area",
      na.rm = FALSE, show.legend = NA, inherit.aes = TRUE)
    
    stat_half_ydensity(mapping = NULL, data = NULL, geom = "half_violin",
      position = "dodge", ..., bw = "nrd0", adjust = 1,
      kernel = "gaussian", trim = TRUE, scale = "area", na.rm = FALSE,
      show.legend = NA, inherit.aes = TRUE)
    

    参数

    参数 解释
    mapping 通过aes()指定图形属性映射。默认为NULL,使用ggplot()aes()指定的映射。
    data 指定数据框。默认为NULL,使用ggplot()中的数据。
    stat 覆盖geom_density()和stat_density()之间的默认连接。
    position 位置调整,可以是字符串,默认为"dodge",也可以是位置调整函数的调用结果。
    ... 其他参数,通常是图形属性,将其设置为固定值,如color = "red"或者size = 3
    side 画半小提琴图的一侧。 “ l”代表左,“ r”代表右,默认为“ l”。
    nudge 在小提琴图和分配给x轴上给定因子的空间中间之间添加空间。
    draw_quantiles 如果不是MULL(默认为NULL),在给定的密度估计分位数处绘制水平线。
    trim 若为TRUE(默认),将小提琴的尾部修整到数据范围。 若为FALSE,不修剪尾巴。
    scale 如果为"area"(默认),则所有小提琴都具有相同的面积(修剪尾部之前)。
    如果为"count",则面积将与观察值成比例地缩放。如果为"width",则所有小提琴都具有相同的最大宽度。
    na.rm 如果为FALSE(默认),则会使用警告删除缺失值。如果为TRUE,则会自动删除缺少的值。
    show.legend 逻辑值,默认为NA,若为FALSE,不显示该图层的图例;若为TRUE,则显示该图层的图例。它也可以是带有名称(图形属性)的逻辑向量,用来选择要显示的图形属性。如show.legend = c(size = TRUE,color = FALSE)表示显示size对应的图例,而不显示color对应的图例。
    inherit.aes 默认为TRUE,若为FALSE,覆盖ggplot()aes()默认属性,而不是与他们组合。
    geom 覆盖geom_density()stat_density()之间的默认连接。
    bw 要使用的平滑带宽度。如果是数字,则为平滑内核的标准差。
    adjust 多次带宽调整。这使得可以在仍使用带宽估计器的情况下调整带宽。例如,adjust = 1/2表示使用默认带宽的一半。
    kernel 内核,平滑曲线方法。详见:density()

    云雨图

    library(tidyverse)
    # 统计摘要
    summ_iris <- iris %>% 
      group_by(Species) %>% 
      summarise(
        mean = mean(Sepal.Length),
        sd = sd(Sepal.Length),
        n = n()
      ) %>% 
      mutate(se = sd/sqrt(n),
             Species = factor(Species, levels = c('versicolor', 'setosa', 'virginica')))
    
    # 数据转换  
    iris_plot <- iris %>% 
      mutate(Species = factor(Species, levels = c('versicolor', 'setosa', 'virginica')))
    
    # 绘图
    library(gghalves)
    library(ggpubr)
    library(ggsignif)
    ggplot(iris_plot , aes(x = Species, y = Sepal.Length, fill = Species))+
      geom_half_violin(aes(fill = Species),
                       position = position_nudge(x = .15, y = 0),
                       adjust=1.5, trim=FALSE, colour=NA, side = 'r') +
      geom_point(aes(x = as.numeric(Species) - 0.1,
                     y = Sepal.Length,color = Species),
                     position = position_jitter(width = .05),size = .25, shape = 20) +
      geom_boxplot(aes(x = Species,y = Sepal.Length, fill = Species),
                   outlier.shape = NA,
                   width = .05,
                   color = "black")+
      geom_point(data=summ_iris,
                 aes(x=Species,y = mean,group = Species, color = Species),
                 shape=18,
                 size = 1.5,
                 position = position_nudge(x = .1,y = 0)) +
      geom_errorbar(data = summ_iris,
                    aes(x = Species, y = mean, group = Species, colour = Species,
                        ymin = mean-se, ymax = mean+se),
                    width=.05,
                    position=position_nudge(x = .1, y = 0)
                    ) +
      scale_color_jco() +
      scale_fill_jco() +
      geom_signif(comparisons = list(c("versicolor", "setosa"),
                                     c("versicolor", "virginica"),
                                     c("setosa", "virginica")),
                  y_position = c(8.2, 8.6, 8.4),
                  map_signif_level = c("***" = 0.001, "**" = 0.01, "*" = 0.05)) +
      ggsave('云雨图.pdf', width = 7, height = 6)
    
    image.png

    转载来自:
    作者:芋圆学徒
    链接:https://www.jianshu.com/p/679b7f9c5c27
    作者:weixin_43700050
    链接:https://blog.csdn.net/weixin_43700050/article/details/107512448

    相关文章:
    gghalves包-你五毛我五毛
    ggplot2实现分半小提琴图绘制基因表达谱和免疫得分
    不同方法画half -小提琴图
    R语言作图——Split violin plot

    相关文章

      网友评论

          本文标题:小提琴图之ggplot_split_violin()及gghal

          本文链接:https://www.haomeiwen.com/subject/trbffrtx.html