日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

R繪圖筆記 | 小提琴圖與漂亮的云雨圖繪制

 生信筆記 2021-07-05

關(guān)于繪圖圖,前面介紹了一些:

R繪圖筆記 | 一般的散點(diǎn)圖繪制

R繪圖筆記 | 柱狀圖繪制

R繪圖筆記 | 直方圖和核密度估計(jì)圖的繪制

R繪圖筆記 | 二維散點(diǎn)圖與統(tǒng)計(jì)直方圖組合

R繪圖筆記 | 散點(diǎn)分布圖與柱形分布圖

R繪圖筆記 | 箱形圖的繪制

這里介紹小提琴圖會(huì)漂亮的云雨圖繪制,小提琴圖在生信文章中很常見(jiàn),云雨圖我在文章中很少見(jiàn)到,但真的很漂亮,發(fā)表文章可以試試。

一.讀入數(shù)據(jù)

如果你想獲取該數(shù)據(jù)用于自己練習(xí),下面是獲取數(shù)據(jù)的地址:

https://docs.qq.com/sheet/DV0dxREV1YkJ0ZmVj

數(shù)據(jù)格式是這樣的。

數(shù)據(jù)第A列是病人ID,B~E列是臨床信息,其他列是病人的RNAseq數(shù)據(jù)。

你可以保存副本導(dǎo)出,然后自己讀入。

library(ggplot2)library(grid)library(RColorBrewer)library(dplyr)library(SuppDists) #提供rJohnson()函數(shù)
data <- read.csv("BioInfoNotesData1.csv",row.names = 1)

假如我們需要繪制某基因在不同分期的表達(dá)情況。

f2.data <- data[,c(1,8)]colnames(f2.data) <- c("Stage","Value")table(f2.data$Stage

先檢查數(shù)據(jù)是否有缺失值,分期信息不知用N來(lái)表示,可以刪除這些數(shù)據(jù)。

f2.data<-f2.data[f2.data$Stage!="N",]head(f2.data

二.繪圖

1.小提琴圖

ggplot繪圖系統(tǒng)中,小提琴圖用geom_violin函數(shù)。

geom_violin(mapping = NULL, data = NULL, stat = "ydensity", position = "dodge", ..., draw_quantiles = NULL, trim = TRUE, scale = "area", na.rm = FALSE, show.legend = NA, inherit.aes = TRUE)

trim:如果為真(默認(rèn)),將小提琴的尾部修剪到數(shù)據(jù)的范圍內(nèi)。如果是假的,就不要修剪尾巴。

 scale :如果“area”(默認(rèn)),所有的小提琴有相同的區(qū)域(在修剪尾巴之前)。如果為“count”,面積按觀察次數(shù)成比例縮放。如果是“寬度”,那么所有的小提琴都有相同的最大寬度。

ggplot(f2.data, aes(Stage,Value))+ geom_violin(aes(fill = Stage),trim = FALSE)+ geom_boxplot(width = 0.2)+ scale_fill_manual(values=c(brewer.pal(5,"Set2")[c(1,3,2,5)]))+ theme_classic()+ labs(x='Stage',y='The expression level',title='Gene name')+ theme(panel.background=element_rect(fill="white",colour="black",size=0.25), axis.line=element_line(colour="black",size=0.25), axis.title=element_text(size=13,face="plain",color="black"), axis.text = element_text(size=12,face="plain",color="black"), legend.position="none" )

修改trim=TRUE,scale="count",看一下效果就知道什么意思啦。

ggplot(f2.data, aes(Stage,Value))+ geom_violin(aes(fill = Stage),trim = TRUE,scale="count")+ geom_boxplot(width = 0.2)+ scale_fill_manual(values=c(brewer.pal(5,"Set2")[c(1,3,2,5)]))+ theme_classic()+ labs(x='Stage',y='The expression level',title='Gene name')+ theme(panel.background=element_rect(fill="white",colour="black",size=0.25), axis.line=element_line(colour="black",size=0.25), axis.title=element_text(size=13,face="plain",color="black"), axis.text = element_text(size=12,face="plain",color="black"), legend.position="none" )

2.云雨圖

云雨圖在我看來(lái)很美觀,我們樣本數(shù)據(jù)大的時(shí)候,繪制云雨圖是真的很美觀。

但這個(gè)圖繪制比前面的圖形稍微復(fù)雜一點(diǎn)。需要自定義一個(gè)函數(shù),用來(lái)繪制半小提琴圖,從geom-violin函數(shù)修改。下面是geom-violin函數(shù)的源碼地址:

https://github.com/hadley/ggplot2/blob/master/R/geom-violin.r

下面是修改后的代碼【參考資料1】:

"%||%" <- function(a, b) { if (!is.null(a)) a else b}
geom_flat_violin <- function(mapping = NULL, data = NULL, stat = "ydensity", position = "dodge", trim = TRUE, scale = "area", show.legend = NA, inherit.aes = TRUE, ...) { layer( data = data, mapping = mapping, stat = stat, geom = GeomFlatViolin, position = position, show.legend = show.legend, inherit.aes = inherit.aes, params = list( trim = trim, scale = scale, ... ) )}GeomFlatViolin <- ggproto("GeomFlatViolin", Geom, setup_data = function(data, params) { data$width <- data$width %||% params$width %||% (resolution(data$x, FALSE) * 0.9)
# ymin, ymax, xmin, and xmax define the bounding rectangle for each group data %>% group_by(group) %>% mutate(ymin = min(y), ymax = max(y), xmin = x, xmax = x + width / 2)
},
draw_group = function(data, panel_scales, coord) { # Find the points for the line to go all the way around data <- transform(data, xminv = x, xmaxv = x + violinwidth * (xmax - x)) #利用transform函數(shù)為數(shù)據(jù)框mydata增加數(shù)據(jù)
newdata <- rbind(plyr::arrange(transform(data, x = xmaxv), -y),plyr::arrange(transform(data, x = xminv), y)) newdata_Polygon <- rbind(newdata, newdata[1,]) newdata_Polygon$colour<-NA
newdata_Path <- plyr::arrange(transform(data, x = xmaxv), -y)
ggplot2:::ggname("geom_flat_violin", grobTree( GeomPolygon$draw_panel(newdata_Polygon, panel_scales, coord), GeomPath$draw_panel(newdata_Path, panel_scales, coord)) ) },
draw_key = draw_key_polygon,
default_aes = aes(weight = 1, colour = "grey20", fill = "white", size = 0.5, alpha = NA, linetype = "solid"),
required_aes = c("x", "y") )

geom_flat_violin函數(shù)是自定義的半小提琴圖函數(shù),用上面的f2.data數(shù)據(jù)繪圖。下面代碼中d變量是統(tǒng)計(jì)數(shù)據(jù)。

d <- group_by(f2.data, Stage) %>% summarize(mean = mean(Value), sd = sd(Value))ggplot(f2.data, aes(Stage,Value, fill=Stage)) + geom_flat_violin(position=position_nudge(x=.2)) + geom_jitter(aes(color=Stage), width=.1) + geom_pointrange(aes(y=mean, ymin=mean-sd, ymax=mean+sd), data=d, size=1, position=position_nudge(x=.2)) + coord_flip() + theme_bw() + theme( axis.text = element_text(size=13), axis.title = element_text(size=15), legend.position="none")

這個(gè)圖就像云下面有雨滴一樣,顧名思義叫云雨圖。如果想縱向展示,去掉coord_flip()函數(shù)就可以啦。coord_flip()翻轉(zhuǎn)笛卡爾坐標(biāo)使水平變?yōu)榇怪薄?/p>

ggplot(f2.data, aes(x=Stage, y=Value)) + geom_flat_violin(aes(fill=Stage),position=position_nudge(x=.25),color="black") + geom_jitter(aes(color=Stage), width=0.1) + geom_boxplot(width=.1,position=position_nudge(x=0.25),fill="white",size=0.5) + #coord_flip() + theme_bw() + theme( axis.text = element_text(size=13), axis.title = element_text(size=15), legend.position="none")

參考資料:

  1. R語(yǔ)言數(shù)據(jù)可視化之美,張杰/著

  2. geom-violin函數(shù)幫助文檔

  3. https://github.com/hadley/ggplot2/blob/master/R/geom-violin.r

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多