小提琴图之ggplot_split_violin()及gghalves包

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容