---
title: "Create Meme in R"
author: "\\
Guangchuang Yu\\
School of Public Health, The University of Hong Kong"
date: "`r Sys.Date()`"
output:
prettydoc::html_pretty:
toc: true
theme: cayman
highlight: github
pdf_document:
toc: true
vignette: >
%\VignetteEngine{knitr::rmarkdown}
%\VignetteIndexEntry{meme introduction}
%\VignetteDepends{ggplot2}
%\VignetteDepends{grid}
%\VignetteDepends{ggimage}
%\VignetteDepends{cowplot}
%\usepackage[utf8]{inputenc}
---
```{r include=FALSE}
knitr::opts_chunk$set(warning = FALSE,
message = TRUE)
library(grid)
library(ggplot2)
library(ggimage)
library(meme)
library(cowplot)
```
## special note for windows users
For windows users, you need to register your font before using it in R graphics
(see discussion [here](https://github.com/GuangchuangYu/meme/issues/1)).
```{r}
if (.Platform$OS.type == "windows") {
windowsFonts(
Impact = windowsFont("Impact"),
Courier = windowsFont("Courier")
)
}
```
## `meme`
Call `meme` to add meme captions:
```{r fig.width=7, fig.height=3.9375}
library(meme)
u <- system.file("angry8.jpg", package="meme")
meme(u, "code", "all the things!")
```
## The grammar of meme
Not that useful, just to mimic `ggplot2`:
```{r fig.width=7, fig.height=3.9375}
mmplot(u) + mm_caption("calm down", "and RTFM",
color="purple")
```
## `meme_save`: a meme version of `ggsave`
The `meme` output can be saved as an object, and can be exported to file using
`meme_save`. `meme_save` helps user setting up
the output figure aspect ratio and calls `ggsave` to export the figure:
```{r message=TRUE}
u2 <- system.file("success.jpg", package="meme")
x <- meme(u2, "please", "tell me more")
```
```{r eval=FALSE}
outfile <- tempfile(fileext=".png")
meme_save(x, file=outfile)
```
## `plot` method
Users can `plot` the `meme` output and change the caption or other parameters in
real time.
```{r fig.width=7, fig.height = 3.94}
plot(x, size = 2, "happy friday!", "wait, sorry, it's monday", color = "firebrick", font = "Courier")
```
## `+` method
Instead of using parameters in `plot()` explictely, Users can use `+ aes()` to set the plot parameters:
```{r fig.width=7, fig.height = 3.94}
x + aes(upper = "#barbarplots",
lower = "friends don't let friends make bar plots",
color = firebrick, font = Courier, size=1.5)
```
or using `+ list()`. The following command will also generate the figure
displayed above.
```{r fig.width=7, fig.height = 3.94, eval=FALSE}
x + list(upper = "#barbarplots",
lower = "friends don't let friends make bar plots",
color = "firebrick", font = "Courier", size=1.5)
```
## multi-language support
I didn't do anything about it. Multi-language was supported internally. Just
simply select a font for your language.
```{r fig.width=7, fig.height=3.9375}
y <- meme(u, "卧槽", "听说你想用中文", font="STHeiti")
y
```
## grid support
```{r fig.width=7}
library(grid)
mm <- meme(u, "code", "all the things!", size=.3, color='firebrick', bgcolor=NULL)
grid.newpage()
pushViewport(viewport(width=.9, height=.9))
grid.rect(gp = gpar(lty="dashed"))
xx <- seq(0, 2*pi , length.out=10)
yy <- sin(xx)
for (i in seq_along(xx)) {
vp <- viewport(x = xx[i]/(2*pi), y = (yy[i]-min(yy))/2, width=.05, height=.05)
print(mm, vp = vp)
}
```
## ggplot2 support
```{r fig.width=7, fig.height=4.06}
library(ggplot2)
library(ggimage)
d <- data.frame(x = xx, y = yy)
ggplot(d, aes(x, y)) + geom_line() +
geom_subview(aes(x, y), data=d, subview=mm, width=.3, height=.15)
ggplot(d, aes(x, y)) +
geom_subview(x = 0, y = 0, subview=mm+aes(size=3), width=Inf, height=Inf) +
geom_point() + geom_line()
```
## cowplot support
```{r fig.width=7, fig.height=7.88, eval=F}
library(cowplot)
plot_grid(x, y, ncol=1, labels = c("A", "B"))
```
## font support
In addition to the fonts installed on your system, there are many amusing fonts
that are funny for meme, *e.g.* fonts on .
```{r fig.width=8, fig.height=4.5, fig.showtext=TRUE, message=TRUE}
## import pokemon fonts
## downloaded from
font_pokemon()
u <- system.file("ash-pikachu.0.0.jpg", package="meme")
meme(u, "Pokemon", "pikachu i choose you!", font='Pokemon_Hollow')
meme(u, "Pokemon", "pikachu i choose you!", font='Pokemon_Solid', color='#FCCF00')
```
You can download fonts and pass the folder to `font_import()` to import
the fonts so that they can be used to create meme.
```{r fig.width=7, fig.height=3.5, fig.showtext=TRUE, message=TRUE}
## folder that contains bubble1 font
## downloaded from https://fontmeme.com/fonts/bubble-1-font/
dir <- system.file('fonts/bubble', package='meme')
font_import(dir)
meme(u, "the meme package", "is awesome!", font="bubble1")
```
Fonts imported by `font_import()` are not restricted in creating meme, you can
use them in other visualization packages.
```{r fig.width=7, fig.height=3.5, fig.showtext=TRUE, message=TRUE}
qplot(1:10, 1:10) + labs(title="meme is awesome") +
theme(plot.title=element_text(family='bubble1', size=30, color='firebrick'))
```