参见:https://mp.weixin.qq.com/s/NGkVxHBM3DmFN17ckzdhZg

    听说你喜欢用柱状图?

    17. 当箱线图遇上小提琴图遇上原始数据,终于忘记了柱状图的名字 - 图1

    或者加个标准差或者标准误?

    17. 当箱线图遇上小提琴图遇上原始数据,终于忘记了柱状图的名字 - 图2

    1. stat_df <- Rmisc::summarySE(iris, measurevar = "Petal.Length", groupvars = "Species")
    2. ggplot(stat_df, aes(Species, Petal.Length, fill=Species)) +
    3. geom_bar(stat = "identity") +
    4. geom_errorbar(aes(ymin = Petal.Length - sd, ymax = Petal.Length + sd), width = 0.2)

    但是,柱状图却会让原先的数据分布表现的并不明了,比如本先的数据分布,四分位数统计量,outlier 值等。

    所以现在流行的不单单是画boxplot,有以下几种方式是显得比较专业的:

    • boxplot + raw data
    • violin plot + boxplot
    • violin plot + raw data
    • violin plot + boxplot + raw data

    但由于这样的图画出来的是对称,信息比较冗余。

    17. 当箱线图遇上小提琴图遇上原始数据,终于忘记了柱状图的名字 - 图3

    如果我们可以显示一半呢?

    比如一半的小提琴图加上原始数据分布:

    1. ggplot(iris, aes(Species, Petal.Length, fill=Species)) +
    2. geom_half_violin(position=position_nudge(x=.2), side=2) +
    3. geom_jitter(aes(color=Species), width=.15)

    17. 当箱线图遇上小提琴图遇上原始数据,终于忘记了柱状图的名字 - 图4

    只需要简单调整一下原始点的抖动,就可以得到分开的结果了。

    我们还可以组合误差棒、箱线图等,获得sd 或se 以及离群值的信息:

    1. ggplot(iris, aes(Species, Petal.Length, fill=Species)) +
    2. geom_half_violin(position=position_nudge(x=.3), side=2) +
    3. geom_boxplot(width=.1, position=position_nudge(x=.22)) +
    4. geom_errorbar(data = stat_df, aes(ymin = Petal.Length - sd, ymax = Petal.Length + sd), width = 0.2) +
    5. geom_jitter(width=.15, aes(color = Species))

    17. 当箱线图遇上小提琴图遇上原始数据,终于忘记了柱状图的名字 - 图5

    结果是上面这样的。

    给隔壁的师兄看了看,它说有点不好看。

    我眉头紧皱,于是又是一幅图:

    1. ggplot(iris, aes(Species, Petal.Length, fill=Species)) +
    2. geom_half_violin(position=position_nudge(x=.2), side=2) +
    3. geom_boxplot(width=.1, position=position_nudge(x=.1)) +
    4. geom_pointrange(data = stat_df, aes(ymin = Petal.Length - sd, ymax = Petal.Length + sd), size=1, position=position_nudge(x=.24)) +
    5. geom_dotplot(binaxis="y", stackdir="down", dotsize=.35)

    17. 当箱线图遇上小提琴图遇上原始数据,终于忘记了柱状图的名字 - 图6

    这样看就好多了呀~