• 新鲜事R语言
  • 诚邀广大R语言、数据可视化爱好者和我们一起搬迁升级谢益辉著作《现代统计图形》

Cloud2016 这个 issue 我之前看到了。cowplot 我不熟,暂时没顾上尝试,不过我猜那样的话可能每个插图大小都要调整,眼下实在没精力,可能将来统稿时统一修改比较容易吧。况且,这个极乐净土版的练习性和实验性很强,基本属于自娱自乐,我并不确定这个并排显示有没有意义……

    dapengde 原来你调用了 ggpubr 包,那也无所谓了,它包裹了 cowplot 所以也具有很强的注释能力

    Liechi 我想了想,你还是把 PR 提给 @dapengde 吧,操作上更方便一些

      Cloud2016 好的。

      Liechi 我做了个任务分配表在项目首页。你要是正在画的话,过来注明一下吧,免得同时重复劳动。4.1 到 4.9 章我今天应该能做完。

        dapengde Liechi

        我建议在 ggplot2 里复现 Base R 图形能不能不仅仅形似,而且做到神似,神似不是要追求真假难辨,而是在深入了解 Base R 绘图的过程后(这其中很可能涉及统计的内容,如直方图),将其等价地转换为 ggplot2 代码。如果把图库这一章按照这要求复现出来,我想应该能在统计和可视化两个层面上更上一层楼,这对于提高这两方面的水平是非常有意义的。练习的意义就会更深一层,毕竟我发现两位大侠都是 ggplot2 的粉丝,基础的操作都会。

        为了说清楚,以现代统计图形之图库之直方图为例,

        # 这是 Base R 版
        par(mfrow = c(2, 2), mar = c(2, 3, 2, .5), mgp = c(2, .5, 0))
        data(geyser, package = "MASS")
        hist(geyser$waiting, main = "(1) freq = TRUE", xlab = "waiting")
        hist(geyser$waiting, freq = FALSE, xlab = "waiting", main = "(2) freq = FALSE")
        hist(geyser$waiting, breaks = 5, density = 10, xlab = "waiting", main = "(3) breaks = 5")
        hist(geyser$waiting, breaks = 40, col = "red", xlab = "waiting", main = "(4) breaks = 40")
        # 这是 ggplot2 版
        library(ggplot2)
        library(cowplot)
        p <- ggplot(aes(waiting), data = geyser)
        p1 <- p + geom_histogram(breaks = seq(40, 110, by = 5))
        p2 <- p + geom_histogram(breaks = seq(40, 110, by = 5), aes(y = stat(density)))
        p3 <- p + geom_histogram(breaks = seq(40, 110, by = 10))
        p4 <- p + geom_histogram(breaks = seq(42, 108, by = 2), fill = "red", color = "black")
        plot_grid(p1, p2, p3, p4, labels = c(
          "(1) freq = TRUE",
          "(2) freq = FALSE",
          "(3) breaks = 5",
          "(4) breaks = 40"
        ), ncol = 2)

        注意 ggplot2 版的 breaks 的设置,它来源于 Base R 版的绘图结果,不是试出来的。以第一个子图为例

        h <- hist(geyser$waiting, main = "(1) freq = TRUE", xlab = "waiting")
        h
        $breaks
         [1]  40  45  50  55  60  65  70  75  80  85  90  95 100 105 110
        
        $counts
         [1]  2 26 29 25 17 10 34 59 44 35 14  3  0  1
        
        $density
         [1] 0.0013377926 0.0173913043 0.0193979933 0.0167224080 0.0113712375
         [6] 0.0066889632 0.0227424749 0.0394648829 0.0294314381 0.0234113712
        [11] 0.0093645485 0.0020066890 0.0000000000 0.0006688963
        
        $mids
         [1]  42.5  47.5  52.5  57.5  62.5  67.5  72.5  77.5  82.5  87.5  92.5  97.5
        [13] 102.5 107.5
        
        $xname
        [1] "geyser$waiting"
        
        $equidist
        [1] TRUE
        
        attr(,"class")
        [1] "histogram"

        此节的另一个例子是

        demo("hist_geyser", package = "MSG")
        df <- data.frame(x = seq(40, 110, 5), y = 0, 
                         xend = seq(40, 110, 5), yend = ht)
        p2 + geom_density(fill = "lightgray", color = "black") +
          geom_segment(aes(x = x, y = y, xend = xend, yend = yend),
            data = df, lty = 3
          )

          Cloud2016 我明白你的意思。这个提议是好的,只是需要时间。

          除了因为懒之外,我眼下是想把能画的先画出来,目标不是跟原图在细节上(如 breaks)都一致,而是用 ggplot 图把文字表达的意思体现出来就算过关了。

          仍然以直方图为例,geom_histogram(breaks = seq(40, 110, by = 5)) 固然可以完全重现图(1),然而原文的意思是想展示 R 直方图使用默认参数值的效果(见该图的 caption),那么我觉得,ggplot2 重绘时也应该展示 geom_histogram() 的默认参数值效果,结果就导致跟原图的 breaks 不一致。

          此节的另一个例子也一样。原书是想展示往直方图添加密度曲线的便利性。便利嘛,越简短越好,所以只需 + geom_density() 就行了。geom_segment() 固然跟原图一致,然而我觉得可能离文字就远了。

          说到底,到底是向原图看齐,还是向文字看齐……

          不论如何,都是可以以后慢慢修改的嘛。

          Cloud2016 这些提议要不都写在 issues 里吧?将来一个一个攻破。放这儿的话怕时间长就忘了。

            6 天 后

            @yihui 自主动接受这个任务到目前为止,我觉得书稿的搬迁工作已经完成了,任务完成了,接下来应该是动内容了,我几次欲动笔,但是限于所学和精力,还是忍住了(除了几个地方添加了 TODO 的想法),所以,我现在想的还是您来操刀,特别是各个章节的后续添加或修改计划,对全书的规划,应该有一个纲领性文件,未来加入贡献的应该会越来越多。

            链接 <https://msg-book.netlify.com/> 是最新的开发版,考虑到后续改动会比较大,所以 <https://bookdown.org/xiangyun/msg/> 维持原稿的样子,只做阶段性推送,算作是稳定版。

            现代统计图形第二版 <https://github.com/XiangyunHuang/MSG-Book/issues/33> 目前是空的,用作真正的书籍大纲,现代统计图形升级计划 <https://github.com/XiangyunHuang/MSG-Book/issues/1> 是我一时头脑发热,任性添加的,没多大参考意义!

              这速度真是让我瞠目结舌。非常感谢楼上各位靠谱厮!这真是应了塞内卡那句话:

              不是因为事情困难,而让我们不敢做;是因为我们不敢做,事情才变得困难。

              我就是不敢碰这本书稿,才觉得把它迁移到 R Markdown 里太困难。

              Cloud2016 限于精力的话就没办法了,限于学识则不用担心。我回来操刀的可能性微乎其微。谁有兴趣的话,我大力欢迎合著者:把你的大名挂在书上,内容上随意改,跟我商量不商量都可以。虚左以待!

                dapengde 对,我不介意退居二作甚至三作,反正我自己肯定是没时间把它捣鼓成一本真的出版物。谁有兴趣尽管上。

                  dapengde 这得看 yihui 是不是在“无出其右”这个场景下用的“虚左以待”了。竖版排印的书作者一般是从右上到左下而排,这时候“虚左”就有“左迁”的意思了。被“虚”的人,如王昌龄,至少得李白写首诗安慰安慰才能平复那颗无处安放的心。

                  哈哈哈,这是我瞎扯的,yihui 当然不是这个意思。

                    多年以前 CRAN 上就有徐俊晓的 统计学与R读书笔记(第六版),这本书已经进行到第六版了,最后还是掉链子了,目前看来应该也不会接上了,这么宏大的工程就一个人在做更加难以完成,如果早期开源出来,或者后来将 tex 书稿开源出来也许还有人继续搞下去,毕竟这本书已经登陆 CRAN 了,影响力也应该可以。我们这个算是一次尝试,很想看看到底是三个僧人没水喝还是一起建了一条沟渠!

                    根据我早些时候流露的想法,在书的写作过程中,不断有新的想法和新的人补充进去,可以是术也可以是道,先从术的部分进入,更新补充书的内容,把书搞厚,把大纲搞长,细分到小节要讲什么,在 Github 上猛开 Issues,然后不断有人将 issues 转化为一个个段落,再把 issues 关掉。至于谁是一作、二作还是三作、四作可以最后就贡献的多少排座次。最后能不能变成一本捧在手里的出版物就不好说了,毕竟电子版完全公开的原创书籍,国内哪个出版社愿意砸钱?

                    总之,希望来一次集体智慧写书 🎨

                      Liechi 懂得太多了就是累……

                      Cloud2016 最后掉链子是啥意思?是指最终没出版吗?这事儿坚持下来挺难的。

                      yihui 不是因为事情困难,而让我们不敢做;是因为我们不敢做,事情才变得困难。

                      我非常认同这句话!感谢谢大的慷慨,不过我还是暂居二作比较好,如果后续又有大把时间搞得话,再去窃据一作的位置 😂

                        Cloud2016 只是参与人数太少了,数来数去也就咱们这三五个人的小狂欢。有时候不得不好奇,人们都哪里去了……

                          dapengde 这个嘛,统计之都论坛的流量并不大,我们也没宣传(除了在论坛里开个贴),知道的人比较少,不过我可以宣传一波,比如借助统计月读,还有微信朋友圈