面向对象有多种实现方式,R里面就有3种,class-based, method-based, object-based,R6与C++/JAVA一样是class-based的,S3/S4是method-based的,还有一种是object-based的,这在proto包中实现,很多人可能没听说过,但是ggplot2你们一定听过,ggplot2就是object-based的实现,它现在是自己的定制实现,称之为ggproto。

emojifont就是用proto实现的,属于我的练手之作,很高兴深受大家的喜欢。

如果我想看一个emoji长啥样,用ggplot2还是麻烦点,用ggplot2是这样画的:

而用base plot,则相对简单些:

![](https://guangchuangyu.github.io/blog_images/R/emojifont/Screen Shot 2017-02-14 at 8.00.23 PM.png)

于是我有了要写个geom_emoji图层的想法:

我在想应该利用emojifont,写个geom_emoji图层,这样直接ggplot()+geom_emoji(“broken_heart”)就可以直接出来,ggplot()+geom_emoji(“chicken”)就出来一只,虽然emojifont已足够易用,但减少输入更加傻瓜,还是可以有的。


过了一天,我就写了geom_emoji,于是如果我想看某个emoji长什么样,比如下面画个玫瑰花:

ggplot() + geom_emoji("rose") + theme_void()

这次的更新,我还换个emoji字体,升级到unicode 9,也就是最新加入的鸭子也能用咯:

ggplot() + geom_emoji("duck") + theme_void()

geom_emoji让画散点也变得简单:

x <- seq(-sqrt(17), sqrt(17), length.out=30)
y1 <- 8*abs(x)/17 + 15* sqrt(17 - x^2)/17
y2 <- 8*abs(x)/17 - 15* sqrt(17 - x^2)/17
ggplot() + geom_emoji("gift_heart", x=x, y=c(y1, y2), color="red", size=10)


制作动图gif也是非常简单,这个代码简直如同人类语言一般:

require(ggplot2)
require(magick)
require(purrr)

x <- search_emoji("heart")

plot_heart=function(x) {
 p = ggplot() + geom_emoji(x)
 o = paste0(x, ".png")
 ggsave(o, p, width=5, height=5)
 o
 }

x %>% map(plot_heart) %>% map(image_read) %>% 
image_join() %>% image_animate(fps=1) %>% 
image_write("heart.gif")

因为换了字体,所以和之前的不同,如果要去背景,只需要+theme_void()就可以。

新版也不同你加载字体的,随包载入自动加载,当然以前的字体还能用,还用一样的办法手工加载。(所以说我这次升级很考究,原来的字体,老方法,新字体你啥都不用干)

同时加入的还有geom_fontawesome图层,最新画hex sticker,用fontawesome蛮好用 -,-

这次更新,主要有3方面:升级了新字体,支持unicode 9;新加入的图层让你非常方便地看一看emoji表情长啥样;再者不需要手工加载字体了。


我在网上看到香港R用户组的教学视频,发现我被‘出镜了’,讲解了emojifont包,好像我在香港还有点小名气,然而我并没有露过脸,视频中也没有。