# An Introduction to emojifont package

#### Guangchuang Yu

#### 2021-04-20

# emojifont: using emoji font in `R`

The `emojifont` package is designed to bring `emoji` font to R users and is created for users that are impatient and relutant to learn.

The package is very simple, pack some emoji fonts (currently only EmojiOne.ttf) and use showtext to render the fonts, then we can use the font in either base plot or ggplot2.

## Installation

Get the released version from CRAN:

    install.packages("emojifont")

Or the development version from github:

    ## install.packages("devtools")
    devtools::install_github("GuangchuangYu/emojifont")

# Emoji characters

To use `emoji`, we need to use their corresponding unicode. Emoji unicode can be found in https://apps.timwhitlock.info/emoji/tables/unicode, or searched using `search_emoji` function. The `search_emoji` function will return emoji aliases which can be converted to unicode by `emoji` function.

    library(emojifont)

    search_emoji('smile')

    ## [1] "smiley"      "smile"       "sweat_smile" "smiley_cat"  "smile_cat"

    emoji(search_emoji('smile'))

    ## [1] "😃" "😄" "😅" "😺" "😸"

# Emoji in R plot

## base plot

    set.seed(123)
    x <- rnorm(10)
    set.seed(321)
    y <- rnorm(10)
    plot(x, y, cex=0)
    text(x, y, labels=emoji('cow'), cex=1.5, col='steelblue', family='EmojiOne')

## ggplot2

    d <- data.frame(x=x, y=y,
         label = sample(c(emoji('cow'), emoji('camel')), 10, replace=TRUE),
         type = sample(LETTERS[1:3], 10, replace=TRUE))

    library("ggplot2")
    ggplot(d, aes(x, y, color=type, label=label)) +
        geom_text(family="EmojiOne", size=6)

To make it easy to used with `ggplot2`, I implemented a very simple layer, `geom_emoji`, to visualize `emoji` with `ggplot2`.

    ggplot() + geom_emoji("rose", color='steelblue') + theme_void()

    x = seq(0, 2*pi, length=30)
    y = sin(x)
    ggplot() + geom_emoji('heartbeat', x=x, y=y, size=10)

# Font Awesome

The `emojifont` package was initially designed for using emoji font. I found that FontAwesome is quite interesting especially in technical world.

The usage is quite similar as using emoji.

    set.seed(2016-03-09)
    fa <- fontawesome(c('fa-github', 'fa-weibo', 'fa-twitter', 'fa-android', 'fa-coffee'))
    d <- data.frame(x=rnorm(20),
                    y=rnorm(20),
                    label=sample(fa, 20, replace=T))

    ggplot(d, aes(x, y, color=label, label=label)) +
        geom_text(family='fontawesome-webfont', size=6)+
        xlab(NULL)+ylab(NULL) +
        theme(legend.text=element_text(family='fontawesome-webfont'))

To make it easy to used with `ggplot2`, a corresponding `geom_fontawesome` is also provided.

    ggplot() + geom_fontawesome("fa-github", color='black') + theme_void()

# phylomoji

Creating phylomoji is possible using `emojifont` and `ggtree`, please refer to the Phylomoji session in the treedata book.

# Limitation

`RStudio` using a different way to open graphics device and `showtext` is currently incompatible with it.

Since `emojifont` use `showtext` as backend to parse emoji font, it also incompatible with `RStudio`.

The solution is to manually open a window by calling `X11()` in Linux, `quartz()` in Mac or `windows()` in Windows, and create plots on top of that, instead of the built-in device offered by `RStudio`.

# Note

Currently, this package support Emoji Font and Font Awesome.

- `EmojiOne.ttf` is downloaded from https://github.com/13rac1/emojione-color-font
- `OpenSansEmoji.ttf` is downloaded from https://github.com/MorbZ/OpenSansEmoji
- `fontawesome-webfont.ttf` is downloaded from https://github.com/FortAwesome/Font-Awesome.

Feel free to fork this package to add your favorite iconic fonts.

# Bugs/Feature requests

If you have any, let me know. Thx!

# Session info

Here is the output of `sessionInfo()` on the system on which this document was compiled:

    ## R version 4.0.5 (2021-03-31)
    ## Platform: x86_64-pc-linux-gnu (64-bit)
    ## Running under: Arch Linux
    ##
    ## Matrix products: default
    ## BLAS:   /usr/lib/libblas.so.3.9.0
    ## LAPACK: /usr/lib/liblapack.so.3.9.0
    ##
    ## locale:
    ##  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C
    ##  [3] LC_TIME=en_US.UTF-8        LC_COLLATE=C
    ##  [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8
    ##  [7] LC_PAPER=en_US.UTF-8       LC_NAME=C
    ##  [9] LC_ADDRESS=C               LC_TELEPHONE=C
    ## [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
    ##
    ## attached base packages:
    ## [1] stats     graphics  grDevices utils     datasets  methods   base
    ##
    ## other attached packages:
    ## [1] colorspace_2.0-0 emojifont_0.5.5  ggplot2_3.3.3
    ##
    ## loaded via a namespace (and not attached):
    ##  [1] highr_0.9         bslib_0.2.4       compiler_4.0.5    pillar_1.6.0
    ##  [5] jquerylib_0.1.3   sysfonts_0.8.3    prettydoc_0.4.1   tools_4.0.5
    ##  [9] digest_0.6.27     jsonlite_1.7.2    evaluate_0.14     lifecycle_1.0.0
    ## [13] tibble_3.1.1      gtable_0.3.0      pkgconfig_2.0.3   rlang_0.4.10
    ## [17] DBI_1.1.1         yaml_2.2.1        xfun_0.22         proto_1.0.0
    ## [21] showtextdb_3.0    withr_2.4.2       stringr_1.4.0     dplyr_1.0.5
    ## [25] knitr_1.32        generics_0.1.0    sass_0.3.1        vctrs_0.3.7
    ## [29] grid_4.0.5        tidyselect_1.1.0  glue_1.4.2        R6_2.5.0
    ## [33] fansi_0.4.2       rmarkdown_2.7     farver_2.1.0      purrr_0.3.4
    ## [37] magrittr_2.0.1    scales_1.1.1      htmltools_0.5.1.1 ellipsis_0.3.1
    ## [41] showtext_0.9-2    assertthat_0.2.1  labeling_0.4.2    utf8_1.2.1
    ## [45] stringi_1.5.3     munsell_0.5.0     crayon_1.4.1