查看: 363|回复: 3

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

[复制链接]
  • TA的每日心情
    忙~
    4 天前
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    管理员

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

    主题
    41
    奥币
    93
    积分
    428
    注册时间
    2019.7.8
    在线时间
    85 小时

    发表于 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
    回复

    使用道具 举报

  • TA的每日心情
    吃饭
    13 小时前
  • 签到天数: 30 天

    连续签到: 22 天

    [LV.5]常住居民I

    帝王蝶

    Rank: 4

    主题
    0
    奥币
    477
    积分
    373
    注册时间
    2019.3.19
    在线时间
    7 小时

    活跃会员最佳新人


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

    使用道具 举报

  • TA的每日心情
    吃饭
    13 小时前
  • 签到天数: 37 天

    连续签到: 21 天

    [LV.5]常住居民I

    中华鲟

    Rank: 5Rank: 5

    主题
    2
    奥币
    447
    积分
    602
    注册时间
    2019.10.25
    在线时间
    22 小时

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

    使用道具 举报

  • TA的每日心情
    no
    前天 09:06
  • 签到天数: 49 天

    连续签到: 5 天

    [LV.5]常住居民I

    钵水母

    Rank: 3Rank: 3

    主题
    0
    奥币
    508
    积分
    79
    注册时间
    2016.8.22
    在线时间
    21 小时

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

    使用道具 举报

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

    本版积分规则

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