当前位置:   article > 正文

R绘图笔记 | 小提琴图与漂亮的云雨图绘制

geom_flat_violin

参考前文:R绘图笔记 | R语言绘图系统与常见绘图函数及参数

关于绘图图,前面介绍了一些:

R绘图笔记 | 一般的散点图绘制

R绘图笔记 | 柱状图绘制

R绘图笔记 | 直方图和核密度估计图的绘制

R绘图笔记 | 二维散点图与统计直方图组合

R绘图笔记 | 散点分布图与柱形分布图

R绘图笔记 | 箱形图的绘制

这里介绍小提琴图会漂亮的云雨图绘制,小提琴图在生信文章中很常见,云雨图我在文章中很少见到,但真的很漂亮,发表文章可以试试。

一.读入数据

如果你想获取该数据用于自己练习,下面是获取数据的地址:

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

数据格式是这样的。

数据第A列是病人ID,B~E列是临床信息,其他列是病人的RNAseq数据。

你可以保存副本导出,然后自己读入。

  1. library(ggplot2)
  2. library(grid)
  3. library(RColorBrewer)
  4. library(dplyr)
  5. library(SuppDists) #提供rJohnson()函数
data <- read.csv("BioInfoNotesData1.csv",row.names = 1)

假如我们需要绘制某基因在不同分期的表达情况。

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

先检查数据是否有缺失值,分期信息不知用N来表示,可以删除这些数据。

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

二.绘图

1.小提琴图

ggplot绘图系统中,小提琴图用geom_violin函数。

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

trim:如果为真(默认),将小提琴的尾部修剪到数据的范围内。如果是假的,就不要修剪尾巴。

 scale :如果“area”(默认),所有的小提琴有相同的区域(在修剪尾巴之前)。如果为“count”,面积按观察次数成比例缩放。如果是“宽度”,那么所有的小提琴都有相同的最大宽度。

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

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

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

2.云雨图

云雨图在我看来很美观,我们样本数据大的时候,绘制云雨图是真的很美观。

但这个图绘制比前面的图形稍微复杂一点。需要自定义一个函数,用来绘制半小提琴图,从geom-violin函数修改。下面是geom-violin函数的源码地址:

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

下面是修改后的代码【参考资料1】:

  1. "%||%" <- function(a, b) {
  2. if (!is.null(a)) a else b
  3. }
  4. geom_flat_violin <- function(mapping = NULL, data = NULL, stat = "ydensity",
  5. position = "dodge", trim = TRUE, scale = "area",
  6. show.legend = NA, inherit.aes = TRUE, ...) {
  7. layer(
  8. data = data,
  9. mapping = mapping,
  10. stat = stat,
  11. geom = GeomFlatViolin,
  12. position = position,
  13. show.legend = show.legend,
  14. inherit.aes = inherit.aes,
  15. params = list(
  16. trim = trim,
  17. scale = scale,
  18. ...
  19. )
  20. )
  21. }
  22. GeomFlatViolin <-
  23. ggproto("GeomFlatViolin", Geom,
  24. setup_data = function(data, params) {
  25. data$width <- data$width %||%
  26. params$width %||% (resolution(data$x, FALSE) * 0.9)
  27. # ymin, ymax, xmin, and xmax define the bounding rectangle for each group
  28. data %>%
  29. group_by(group) %>%
  30. mutate(ymin = min(y),
  31. ymax = max(y),
  32. xmin = x,
  33. xmax = x + width / 2)
  34. },
  35. draw_group = function(data, panel_scales, coord) {
  36. # Find the points for the line to go all the way around
  37. data <- transform(data, xminv = x,
  38. xmaxv = x + violinwidth * (xmax - x)) #利用transform函数为数据框mydata增加数据
  39. newdata <- rbind(plyr::arrange(transform(data, x = xmaxv), -y),plyr::arrange(transform(data, x = xminv), y))
  40. newdata_Polygon <- rbind(newdata, newdata[1,])
  41. newdata_Polygon$colour<-NA
  42. newdata_Path <- plyr::arrange(transform(data, x = xmaxv), -y)
  43. ggplot2:::ggname("geom_flat_violin", grobTree(
  44. GeomPolygon$draw_panel(newdata_Polygon, panel_scales, coord),
  45. GeomPath$draw_panel(newdata_Path, panel_scales, coord))
  46. )
  47. },
  48. draw_key = draw_key_polygon,
  49. default_aes = aes(weight = 1, colour = "grey20", fill = "white", size = 0.5,
  50. alpha = NA, linetype = "solid"),
  51. required_aes = c("x", "y")
  52. )

geom_flat_violin函数是自定义的半小提琴图函数,用上面的f2.data数据绘图。下面代码中d变量是统计数据。

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

这个图就像云下面有雨滴一样,顾名思义叫云雨图。如果想纵向展示,去掉coord_flip()函数就可以啦。coord_flip()翻转笛卡尔坐标使水平变为垂直。

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

参考资料:

  1. R语言数据可视化之美,张杰/著

  2. geom-violin函数帮助文档

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/131822
推荐阅读
相关标签
  

闽ICP备14008679号