基佬的屁股和科学家的屎,之间的共同点是…!》这篇推文发表之后,发现大家对屎尿屁还是蛮有兴趣的,画屎除了展示的emojifont包之外,也提到了ggimage包,其实用ggimage包更有趣!这里也演示一下,一起来玩屎,看看自己到底是搅屎棍还是化粪池!玩屎玩出花来。

先来一张线性拟合的图:

set.seed(123)
iris2 <- iris[sample(1:nrow(iris), 30), ]
model <- lm(Petal.Length ~ Sepal.Length, data = iris2)
iris2$fitted <- predict(model)

iris3 <- iris2[abs(iris2$Petal.Length-iris2$fitted) > 0.5,]
p <- ggplot(iris2, aes(x = Sepal.Length, y = Petal.Length)) +
    geom_point() +
    geom_linerange(aes(ymin = fitted, ymax = Petal.Length),
                   data=iris3, colour = "purple") +
    geom_abline(intercept = model$coefficients[1],
                slope = model$coefficients[2])
p

这个例子中,做了一个线性拟合,残差大的点,用直线连起来,而残差小的,就只打点不连线(少量因为x位置相同,重叠了,看着有线但实际没有连)。为什么要这样来区分?因为我要用一个屎的图片把残差大的点打上屎。而残差小的,就任由它打点。

下面的指令一个geom_image在残差大的地方打上屎,另一个geom_image图层则在空白的地方画一个大一点的屎。

require(ggimage)
img <- 'https://cdn.pixabay.com/photo/2016/12/18/20/01/emotions-1916662_960_720.png'
p + geom_image(image = img, data=iris3) + 
    geom_image(x=7, y=2.5, image=img, size=.4)

另外,ggimage是非常牛逼的,你可以直接给图片按照变量上色,这里残差大的用红色的屎表示,残差小的则用蓝色的屎表示:

p + geom_image(aes(color=abs(Petal.Length-fitted)>0.5),
               image = img) + theme(legend.position="none") +
    scale_color_manual(values=c("steelblue", "firebrick")) +
    geom_image(x=7, y=2.5, image=img, size=.4)

下次组会跟老板讲结果,遇到屎一样的结果,就画个屎在旁边吧。遇到p值显著的,就画个笑脸,遇到不显著的,就画一坨屎!这么有个性的学生,老板必定对你终生难忘。

这里残差只是直观地来看拟合的效果,拟合得好不好,有多种方法可以评估,萝卜白菜,各有所爱。