查看: 3129|回复: 3

[R语言] 如何绘制好看的豆荚图?

[复制链接]

管理员

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

主题
153
注册时间
2019.7.8
在线时间
243 小时

发表于 2019.11.11 10:36:27 | 显示全部楼层 |阅读模式
之前在一篇Science文章中看到过下图这样的图表,一直好奇是如何绘制的。

Science, 2015

后来,在去年的光棍节前一天推出的微信文章介绍了Origin 2019绘制类
《如何用Origin绘制分边小提琴图》似图表的方法,参考《如何用Origin绘制分边小提琴图》一文,但绘图的效果仍然和这篇文章的图表(Split violin)有些许差异,如下图。


这里我为大家介绍一个叫”beanplot”的R包,可以绘制出Science文章中的图表效果。由于它绘制的图形很像豆荚,加上R包的名字,我暂且把这样的图表称为“豆荚图”,下面就看下如何绘制豆荚图吧。


豆荚图与箱型图

绘图脚本:

#R包的安装;
install.packages("beanplot")
install.packages("vioplot")
install.packages("lattice")

#载入R包;
library("beanplot")
library("vioplot")

#测试数据生成,比较一些常见的分布比如双峰模型,均匀分布,正态分布;
mu <- 2
si <- 0.6
c <- 500
bimodal <- c(rnorm(c/2, -mu, si), rnorm(c/2, mu, si))
uniform <- runif(c, -4, 4)
normal <- rnorm(c, 0, 1.5)

#绘图参数设置,绘制1行2列的组合图;
par(mfrow = c(1, 2), mai = c(0.5, 0.5, 0.5, 0.2))
ylim <- c(-7, 7)

#箱型图和豆荚图的绘制;
boxplot(bimodal, uniform, normal, ylim = ylim,
        main = "boxplot",names = 1:3,
        col = "#006ebc")

beanplot(bimodal, uniform, normal, ylim = ylim,
         main = "beanplot",
         col = c("#ffc236","#006ebc","#006ebc"), border = NA)


箱型图只能笼统地展示数据分布的分位数位置,如下图,很难区分均匀分布和双峰分布,而豆荚图可以更清楚的展示出数据真实的分布情况。


豆荚图与小提琴图

绘图脚本:

#beanplot和小提琴图的比较;
# 载入"lattice"包中的数据;
data("singer", package ="lattice")

#绘图参数设置,绘制2行1列的组合图;
ylim <- c(55, 80)
par(mfrow = c(2, 1), mai = c(0.6, 0.8, 0.5,0.5))

#小提琴图的绘制;
dt <- split(singer$height,singer$voice.part)
names(dt)[1] <- "x"
vioplot(dt,ylim = ylim, names =levels(singer$voice.part), col = "#ffc236")
title(main = "vioplot", ylab ="body height (inch)")

#豆荚图的绘制;
beanplot(height ~ voice.part,
        data = singer, ll = 0.04,
        ylim = ylim, col = c("#ffc236","#ffc236","#ffc236"),
        main = "beanplot",
        ylab = "body height (inch)")


不论外形还是功能,二者其实极为相似,如下图,但vioplot包绘制的小提琴图是“平头”的,和ggplot2、Origin绘制的小提琴图是有区别的。


“不对称”豆荚图

绘图脚本:


#当每组数据包含亚组数据时, 可以绘制不对称的豆荚图;
par(lend = 1, mai = c(0.5, 0.8, 0.5, 0.5))
beanplot(height ~ voice.part, data =singer, ll = 0.04,
        main = "beanplot", ylab = "body height (inch)", side= "both",
        border = NA,horizontal = T,
        col = list(c("#006ebc","#006ebc"),c("#ffc236", "#ffc236")))

legend("bottomleft", fill =c("#006ebc", "#ffc236"),
       legend = c("Group 2", "Group 1"))
legend("topright", fill =c("#006ebc", "#ffc236"),
      legend = c("Group 2", "Group 1"))


豆荚图还可以展示“亚组”数据,绘制出Science文章中那样的“不对称”豆荚图。



今天的内容就分享到这里啦~


参考文献
1. Sunagawa S, Coelho L P, Chaffron S, et al.Structure and function of the global ocean microbiome[J]. Science, 2015,348(6237): 1261359.2. Kampstra P. Beanplot: A boxplotalternative for visual comparison of distributions[J]. 2008.

本文作者:基迪奥-莫北

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
新的一天加油!
回复

使用道具 举报

中华鲟

Rank: 5Rank: 5

主题
0
注册时间
2019.3.19
在线时间
11 小时

发表于 2019.11.12 09:33:53 | 显示全部楼层
感谢楼主分享
回复 支持 反对

使用道具 举报

中华鲟

Rank: 5Rank: 5

主题
2
注册时间
2019.10.25
在线时间
30 小时

发表于 2019.11.12 09:39:32 | 显示全部楼层
优秀R包感谢楼主
回复 支持 反对

使用道具 举报

钵水母

Rank: 3Rank: 3

主题
0
注册时间
2016.8.22
在线时间
27 小时

发表于 2019.11.16 12:13:49 | 显示全部楼层
感谢楼主分享
啊啊啊
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表