诚邀广大R语言、数据可视化爱好者和我们一起搬迁升级谢益辉著作《现代统计图形》
我建议在 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()
固然跟原图一致,然而我觉得可能离文字就远了。
说到底,到底是向原图看齐,还是向文字看齐……
不论如何,都是可以以后慢慢修改的嘛。
dapengde 我做的这个例子已经放到 first-edition-update 分支里了,作为开发版 <https://msg-book.netlify.com/gallery.html#sec:hist> 另外像这种大改动我已经在 issues 把它列为升级计划
@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> 是我一时头脑发热,任性添加的,没多大参考意义!
- 已编辑
多年以前 CRAN 上就有徐俊晓的 统计学与R读书笔记(第六版),这本书已经进行到第六版了,最后还是掉链子了,目前看来应该也不会接上了,这么宏大的工程就一个人在做更加难以完成,如果早期开源出来,或者后来将 tex 书稿开源出来也许还有人继续搞下去,毕竟这本书已经登陆 CRAN 了,影响力也应该可以。我们这个算是一次尝试,很想看看到底是三个僧人没水喝还是一起建了一条沟渠!
根据我早些时候流露的想法,在书的写作过程中,不断有新的想法和新的人补充进去,可以是术也可以是道,先从术的部分进入,更新补充书的内容,把书搞厚,把大纲搞长,细分到小节要讲什么,在 Github 上猛开 Issues,然后不断有人将 issues 转化为一个个段落,再把 issues 关掉。至于谁是一作、二作还是三作、四作可以最后就贡献的多少排座次。最后能不能变成一本捧在手里的出版物就不好说了,毕竟电子版完全公开的原创书籍,国内哪个出版社愿意砸钱?
总之,希望来一次集体智慧写书
让yihui博客一发推特一发