跟著Molecular Cancer學(xué)作圖 -- 分半小提琴圖

跟著Molecular Cancer學(xué)作圖 -- 分半小提琴圖.png

從這個系列開始一睁,師兄就帶著大家從各大頂級期刊中的Figuer入手厅翔,從仿照別人的作圖風(fēng)格到最后實(shí)現(xiàn)自己游刃有余的套用在自己的分析數(shù)據(jù)上呢簸!這一系列絕對是高質(zhì)量!還不趕緊點(diǎn)贊+在看漓概,學(xué)起來漾月!

示例數(shù)據(jù)和代碼獲取

生信常用分析圖形+跟著高分SCI學(xué)作圖

參考文獻(xiàn)

話不多說,直接上圖胃珍!

讀圖

原圖

這張圖理解起來沒什么復(fù)雜的梁肿,就是一個分組提琴圖蜓陌,然后將兩個組的小提琴分別顯示一半,這樣更方便讀者直觀比較吩蔑。本小節(jié)我們介紹兩種實(shí)現(xiàn)方法钮热,一種是基于gghalves包中的geom_half_violin函數(shù),另一種是借助github大佬編寫的geom_split_violin函數(shù)烛芬。

效果展示

效果展示

由于本次使用的數(shù)據(jù)分布并不是很好隧期,所以提琴的形狀并不是很美觀,但是圖形的外觀和細(xì)節(jié)都基本復(fù)現(xiàn)了原文赘娄。本次復(fù)現(xiàn)完全在R語言中進(jìn)行仆潮,請大家放心食用!

數(shù)據(jù)構(gòu)建

####################### 分半提琴圖 ####################
library(ggplot2)
library(gghalves)
library(tidyverse)

# 讀取測試數(shù)據(jù):此數(shù)據(jù)集來源于GSE142651遣臼,隨機(jī)挑選25個基因:
data <- read.csv("data.csv")
data <- data[sample(1:nrow(data), 10),]


# 寬數(shù)據(jù)轉(zhuǎn)長數(shù)據(jù):
data_new <- data %>% 
  pivot_longer(cols = !X, 
               names_to = "Samples", 
               values_to = "Values")

colnames(data_new)[1] <- "Genes"

# 添加分組信息:
data_new$group <- str_split(data_new$Samples, "_", simplify = T)[,4]
# 查看數(shù)據(jù)
head(data_new)
# # A tibble: 6 x 4
# Genes Samples                     Values group    
# <chr> <chr>                        <dbl> <chr>    
# 1 MCM5  Chip91481_r20_c71_Untreated   7.84 Untreated
# 2 MCM5  Chip91481_r47_c21_Untreated   5.12 Untreated
# 3 MCM5  Chip91484_r0_c62_Untreated    5.67 Untreated
# 4 MCM5  Chip91481_r16_c70_Untreated   5.12 Untreated
# 5 MCM5  Chip91484_r0_c35_Treated      6.67 Treated  
# 6 MCM5  Chip91484_r37_c38_Untreated   5.12 Untreated

繪圖代碼

geom_half_violin函數(shù)

# 繪圖:
ggplot()+
  geom_half_violin(
    data = data_new %>% filter(group == "Treated"),
    aes(x = Genes,y = Values),colour="white",fill="#1ba7b3",side = "l"
  )+
  geom_half_violin(
    data = data_new %>% filter(group == "Untreated"),
    aes(x = Genes,y = Values),colour="white",fill="#dfb424",side = "r"
  )+
  theme_bw()+
  xlab("")+
  ylab("log2(CPM)")+
  geom_point(data = data_new, aes(x = Genes,y = Values, fill = group),
             stat = 'summary', fun=mean,
             position = position_dodge(width = 0.2))+
  stat_summary(data = data_new, aes(x = Genes,y = Values, fill = group),
               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.2))+
  stat_compare_means(data = data_new, aes(x = Genes,y = Values, fill = group),
                     # 修改顯著性標(biāo)注:
                     symnum.args=list(cutpoints = c(0, 0.001, 0.01, 0.05, 1),
                                      symbols = c("***", "**", "*", "-")),
                     label = "p.signif",
                     label.y = max(data_new$Values),
                     hide.ns = F)+
  theme(axis.text.x = element_text(angle = 45, hjust = 1), 
        legend.position = "top",
        legend.justification = "right")
  

ggsave("violin_plot.pdf", height = 5, width = 10)
效果1

方法二

# 方法二:使用geom_split_violion函數(shù):
# 函數(shù)來源:https://github.com/tidyverse/ggplot2/blob/eecc450f7f13c5144069705ef22feefe0b8f53f7/R/geom-violin.r#L102
GeomSplitViolin <- ggproto("GeomSplitViolin", GeomViolin, 
                           draw_group = function(self, data, ..., draw_quantiles = NULL) {
                             data <- transform(data, xminv = x - violinwidth * (x - xmin), xmaxv = x + violinwidth * (xmax - x))
                             grp <- data[1, "group"]
                             newdata <- plyr::arrange(transform(data, x = if (grp %% 2 == 1) xminv else xmaxv), if (grp %% 2 == 1) y else -y)
                             newdata <- rbind(newdata[1, ], newdata, newdata[nrow(newdata), ], newdata[1, ])
                             newdata[c(1, nrow(newdata) - 1, nrow(newdata)), "x"] <- round(newdata[1, "x"])
                             
                             if (length(draw_quantiles) > 0 & !scales::zero_range(range(data$y))) {
                               stopifnot(all(draw_quantiles >= 0), all(draw_quantiles <=
                                                                         1))
                               quantiles <- ggplot2:::create_quantile_segment_frame(data, draw_quantiles)
                               aesthetics <- data[rep(1, nrow(quantiles)), setdiff(names(data), c("x", "y")), drop = FALSE]
                               aesthetics$alpha <- rep(1, nrow(quantiles))
                               both <- cbind(quantiles, aesthetics)
                               quantile_grob <- GeomPath$draw_panel(both, ...)
                               ggplot2:::ggname("geom_split_violin", grid::grobTree(GeomPolygon$draw_panel(newdata, ...), quantile_grob))
                             }
                             else {
                               ggplot2:::ggname("geom_split_violin", GeomPolygon$draw_panel(newdata, ...))
                             }
                           })

geom_split_violin <- function(mapping = NULL, data = NULL, stat = "ydensity", position = "identity", ..., 
                              draw_quantiles = NULL, trim = TRUE, scale = "area", na.rm = FALSE, 
                              show.legend = NA, inherit.aes = TRUE) {
  layer(data = data, mapping = mapping, stat = stat, geom = GeomSplitViolin, 
        position = position, show.legend = show.legend, inherit.aes = inherit.aes, 
        params = list(trim = trim, scale = scale, draw_quantiles = draw_quantiles, na.rm = na.rm, ...))
}

ggplot(data_new, aes(x = Genes,y = Values, fill = group))+
  geom_split_violin(trim = T,colour="white")+
  geom_point(stat = 'summary',fun=mean,
             position = position_dodge(width = 0.2))+
  scale_fill_manual(values = c("#1ba7b3","#dfb424"))+
  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.2))+
  stat_compare_means(data = data_new, aes(x = Genes,y = Values),
                     # 修改顯著性標(biāo)注:
                     symnum.args=list(cutpoints = c(0, 0.001, 0.01, 0.05, 1),
                                      symbols = c("***", "**", "*", "-")),
                     label = "p.signif",
                     label.y = max(data_new$Values),
                     hide.ns = F)+
  theme_bw()+
  xlab("")+
  ylab("log2(CPM)")+
  theme(axis.text.x = element_text(angle = 45, hjust = 1), 
        legend.position = "top",
        #legend.key = element_rect(fill = c("#1ba7b3","#dfb424")),
        legend.justification = "right")

ggsave("violin_plot2.pdf", height = 5, width = 10)
效果2

結(jié)果展示

效果展示

示例數(shù)據(jù)和代碼獲取

生信常用分析圖形+跟著高分SCI學(xué)作圖

以上就是本期的全部內(nèi)容啦性置!歡迎點(diǎn)贊,點(diǎn)在看揍堰!師兄會盡快更新哦鹏浅!制作不易,你的打賞將成為師兄繼續(xù)更新的十足動力个榕!

往期文章

  1. 跟著Nature Medicine學(xué)作圖--箱線圖+散點(diǎn)圖
  2. 跟著Nature Communications學(xué)作圖--漸變火山圖
  3. 跟著Nature Communications學(xué)作圖--氣泡圖+相關(guān)性熱圖
  4. 跟著Nature Communications學(xué)作圖 -- 復(fù)雜提琴圖
  5. 跟著Nature Communications學(xué)作圖 -- 復(fù)雜熱圖
  6. 跟著Nature Communications學(xué)作圖--復(fù)雜散點(diǎn)圖
  7. 跟著Nature Communications學(xué)作圖 -- 復(fù)雜百分比柱狀圖
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末篡石,一起剝皮案震驚了整個濱河市芥喇,隨后出現(xiàn)的幾起案子西采,更是在濱河造成了極大的恐慌,老刑警劉巖继控,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件械馆,死亡現(xiàn)場離奇詭異,居然都是意外死亡霹崎,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門冶忱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來尾菇,“玉大人,你說我怎么就攤上這事囚枪∨晌埽” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵链沼,是天一觀的道長默赂。 經(jīng)常有香客問我,道長括勺,這世上最難降的妖魔是什么缆八? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任曲掰,我火速辦了婚禮,結(jié)果婚禮上奈辰,老公的妹妹穿的比我還像新娘栏妖。我一直安慰自己,他們只是感情好奖恰,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布底哥。 她就那樣靜靜地躺著,像睡著了一般房官。 火紅的嫁衣襯著肌膚如雪趾徽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天翰守,我揣著相機(jī)與錄音孵奶,去河邊找鬼。 笑死蜡峰,一個胖子當(dāng)著我的面吹牛了袁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播湿颅,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼载绿,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了油航?” 一聲冷哼從身側(cè)響起崭庸,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谊囚,沒想到半個月后怕享,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡镰踏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年函筋,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奠伪。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡跌帐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出绊率,到底是詐尸還是另有隱情谨敛,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布即舌,位于F島的核電站佣盒,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏顽聂。R本人自食惡果不足惜肥惭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一盯仪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蜜葱,春花似錦全景、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至揭鳞,卻和暖如春炕贵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背野崇。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工称开, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人乓梨。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓鳖轰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親扶镀。 傳聞我的和親對象是個殘疾皇子蕴侣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容