《画图给点分组?》这一篇文章中给出了方法,画出两层分组的点图,一层分组是按照离散型变量在x轴上分组,第二层是每一个分组里,再来一个离散型变量再分一次。非常感谢读者们的反馈,原来这第二层分组在ggplot2中是有内置的实现方式的,那就是position_jitterdodge
。
当年我准备考博的时候,健康院某PI(本来的意向导师)找我帮他在iMac上安装盗版的Papers
(文献管理器)和Illustrator
(PS的兄弟),安装后,跟我说:“我们做科研的,最重要的软件就是Papers和Illustrator。”,当然后来感觉挺坑我,就放弃了。
这么多年过去了,至今这两个软件我都没用过!我画图,追求的是全部由代码产生,至今还没有修图的需求,也就没有试过Illustrator
了。
Illustrator
必须有些门槛,而且关键是Adobe
绑死在PDF上,实际上如果80%的问题都可以用PowerPoint
解决,剩下那20%,反正也不常用。而PowerPoint
的优点是没有门槛,傻瓜式操作,像我这种怀疑自己智商的人,都会用啊!
要是R
画的图,能够在PowerPoint
里面编辑就好了!
要是R
画的图,能够在PowerPoint
里面编辑就好了!
要是R
画的图,能够在PowerPoint
里面编辑就好了!
library(ggplot2)
pups <- nlme::RatPupWeight %>%
janitor::clean_names() %>%
dplyr::mutate(litter = as.integer(litter))
p <- ggplot(pups, aes(x = litter, y = weight, color = treatment))
针对某一个x值,我们可以画出相应y的统计量,比如均值、方差等,这些都可以“手工”的方式通过图层叠加来实现。
p + geom_jitter(shape=1) +
stat_summary(fun.y = "mean", size=2, geom="point", color = 'black') +
stat_summary(fun.data = mean_cl_normal, geom="errorbar", width=.1, color='black')
有小伙伴问为什么R里循环出不来图?
其实看我公众号的各位读者们,你们不应该有这个问题,如果有,那么证明我的文章没有好好看!有两篇很重要的文章《扪心自问,meme几何?》和《树变图,图变树? ?》,特别是第二篇,和这个问题息息相关。
首先假设我们有一个图:
require(ggplot2)
p = qplot(1:10)
为什么在终端打p可以出图?
因为在R里,所有都是对象,而在终端里你输入一个对象回车,R会去找相应的方法去打印出来,如果是S3对象,会去寻找print方法,而如果是S4会去找show方法。
我在2018年4月份的一条推特文,https://twitter.com/guangchuangyu/status/988672880551518210,可以把UpSetR
变成ggplot
然后可以各种玩,比较我在推特文中所展示的,图上嵌入venn图、使用cowplot
拼图等。然而过了大半年,我的pull request并没有被作者接收,也就是说这功能还不存在于官方的版本中。
如果有兴趣的话,应该安装我fork的版本。
devtools::install_github("GuangchuangYu/UpSetR")
生物狗喜欢画barplot,但毕竟只有均值和标准误差信息量太低,万一有outliers呢?万一不是正态分布呢?所以就吐槽了又吐槽,但大家还是乐此不疲,因为大家都在用,因为很多人只会画barplot,所以产生各种反barplot运动,并呼吁大家使用boxplot,boxplot有四分位数的统计量,可以反应outlier和数据的分布,比barplot高得多了。
然而事情是不断在进化的,我们的手段是要跟上潮流的,现在的潮流就是除了要有统计量,还要有原始数据,甚至于有统计推断,全集中一图中,揭开数据的红盖头,给大家呈现全方位无死角的面貌。
小伙伴发来这个图,问我是不是bug
,这真是犯了程序员的社交礼仪。
你如果对一个程序员说,“你的代码有bug。” 他的第一反应是:
- 你的环境有问题吧
- 傻逼你会用吗。
如果你委婉地说:“你这个程序和预期的有点不一致,你看看是不是我的使用方法有问题。”
他本能地会想:“操,是不是出bug了!”
这显然不是bug
,这是绝大多数人对ggplot2
的误解,他们认为用xlim
和ylim
是放置一个窗口去看你的图,然而在ggplot2
是限定一个窗口去过滤你的数据,并重新画图!你的数据被过滤了!如果是放置窗口在图上,一条线从A到B,如果B在窗口之外,那么线被截断了,你看到半条线,但如果是过滤数据呢?B不复存在,那么线条A到B也不复存在,没有B,A到B的线画不出来。就是这样,所以这绝逼不是bug
,而是程序员本能反应的第二种情况,你用错了。
那么怎么样不过滤数据,而只是设置可视化窗口呢?你基本上很少看到有人这么用,因为几乎99%的人都只知道xlim
和ylim
,一般人我也不告诉他,快点拿去小抄把下面的代码记录一下。