周日是港大医学院的198届毕业典礼,Y叔要去参加,今年也正好是医学院130周年,做为画图界的传说,我决定画一个蛋糕。

要画蛋糕,这有何难,我们有emojifont啊,还记得《emojifont新功能(有视频哦)》一文中的geom_emoji图层吗?

require(emojifont)
ggplot() + geom_emoji('cake')

蛋糕上还有草莓,好想咬一口吧?请看蛋糕的眼神~

圣诞节就要来了,你该知道怎么画一颗圣诞树了,到时候可以装逼了。

ggplot() + geom_emoji('christmas_tree')

当然用我的emojifont包,画的是emoji,不是本事!没有诚意!这世道不来个手工制作都不显得上档次。

画蛋糕无非是搞些椭圆和线条来拼,再者是矩形和菱形来拼凑个蜡烛。这个当然是用grid来写grob对象咯,然后再拼grob对象成为一个新的对象cakeCandleGrob:

require(grid)
require(gridExtra)
require(yyplot)

cake1 <- yyplot:::cakeCandleGrob("#FF3399")
cake2 <- yyplot:::cakeCandleGrob("steelblue")
grid.arrange(grobs=gList(cake1, cake2), ncol=2)

这个cakeCandleGrob对象虽然是打了一组王八拳,用多个对象组合起来的,但它自己就是一个实实在在的对象,我们可以不断提高姿(chou)势(xiang)水平,最后大家看到的却是一套少林长拳。

我们来封装一下,变成一个ggplot2图层,这里我写一个geom_cake的图层。然后我们拿它来画散点图:

require(ggplot2)

t <- seq(0,2*pi, by=0.2)
x <- 16*sin(t)^3
y <- 13*cos(t) - 5*cos(2*t) - 2*cos(3*t) - cos(4*t)
d <- data.frame(x=x, y=y)

ggplot(d, aes(x, y)) + geom_cake()

当你分类太多,不够形状来区分的时候,不要怪别人,要怪自己不会造形状,这里蛋糕就是个形状有点奇怪的点,各种形状你都可以自己造。

我们还可以映射不同的颜色,不同的大小。

d$color.cake = sample(colorspace::rainbow_hcl(5), nrow(d), replace=T)
d$color.candle = sample(rainbow(5), nrow(d), replace=T)
ggplot(d, aes(x, y)) + 
	geom_cake(aes(color.cake=color.cake, 
	              color.candle=color.candle), 
	          size=.2)

蜡烛的火也是可以设置的,这里再画一个,把它和蛋糕设为一样的颜色。做为一个实实在在的对象,我们除了指定位置来画,画多大之外,还可以随意旋转,这就是抽象的魔力,我们拥有了更牛逼的表达力。

d$color.cake = sample(colorspace::rainbow_hcl(5), nrow(d), replace=T)
d$color.candle = sample(rainbow(5), nrow(d), replace=T)
d$size = runif(nrow(d), 0.05, 0.2)
d$angle = runif(nrow(d), -360, 360)
ggplot(d, aes(x, y)) + 
	geom_cake(aes(color.cake=color.cake, 
		      color.candle=color.candle, 
		      color.fire=color.cake, 
                      size=I(size), 
		      angle=angle)) 

之前画过《draw batman logo》,大家不知道还有没有印象,那时候只是打点,我们其实可以把它画成多边形,这样外围可以有个颜色,内部可以填充个颜色,这样就可以用蝙蝠侠的飞镖来画散点了,可以随意映射大小,可以随意旋转,嗯,Bruce Wayne向你扔来一大波飞镖。如果以后再去罪恶之城chicago的话,我就写一个geom_batman图层。