ggplot2でFont Awesomeのアイコンを使ってプロット

そういえばちょっと前にキャプテンアメリカがwaffleというパッケージをつくってて、それの中でFont Awesomeを使ってました。これどうやってるのか調べたのでメモ。

rud.is

やってることは単純で、

  • Font Awesomeをインストール
  • extrafontを使ってそれを呼び出す
  • ggplotでラベルとフォント名を指定(family="FontAwesome"

という感じです。

RPubs - ggplot2 with FontAwesome

Font Awesome

Font Awesomeは、アイコンとして使えるフォントです。画像ではなくフォントなので、サイズを変えたり色を変えたりできます。

fortawesome.github.io

extrafont

extrafontは、Rが標準で使ってる以外のフォントもお手軽に呼び出せるようにするパッケージです。数式用のフォントを使いたいときとかによく使われるみたいです(あんまりよく知らない)。自分で読み込むフォントは、TrueType(拡張子.ttf)である必要があります。

github.com

Font Awesomeをインストール

Windows(たぶんMacも)

FontAwesomeのサイトからZIPファイルをダウンロードしてきて(どうでもいいけどサブドメイン、Fort awesomeってなんかかっこいい…)、fontawesome-webfont.ttfをダブルクリックすればインストールボタンが現れるはずです。それをポチればもう準備完了です。

ちなみにWindowsの場合は、たぶんフォントをインストールしなくても使えるっぽかったです。

↓こんな感じ。(これだと一時フォルダが消えたら終わりですけど。。)

library(extrafont)

fa_font <- tempfile(fileext = ".ttf")
download.file("http://maxcdn.bootstrapcdn.com/font-awesome/4.3.0/fonts/fontawesome-webfont.ttf?v=4.3.0",
              destfile = fa_font, method = "curl")

font_import(paths = dirname(fa_font), prompt = FALSE)

if (.Platform$OS.type == "windows") loadfonts("win")

そういえばなぜかdownload.file()methodがデフォルト(たぶん"internal"?)だとファイルが化けてました。なんでだったんだろう。

Linux

パッケージでインストールする

たとえばUbuntuだとfonts-font-awesomeというパッケージがあるのでそれをインストールすれば終わりです。

# apt-get install fonts-font-awesome

ただしちょっと古かったりすることもあるので、表示したい文字が入ってなかったりするかもしれません。そういう場合は、最新版を手動でインストールします。

手動でインストール

正しい手順はググれば出てくるはず。むりやりRでやるならこうです。

if(!dir.exists('~/.fonts')) dir.create('~/.fonts')

download.file("http://maxcdn.bootstrapcdn.com/font-awesome/4.3.0/fonts/fontawesome-webfont.ttf?v=4.3.0",
              destfile = '~/.fonts', method = "curl")

# キャッシュを更新
system('fc-cache -vf')

このあとRのセッションを再起動するとフォントをRの中から使えるようになってました。

extrafontを使ってそれを呼び出す

font_import()という関数でフォントを取り込みますが、何も引数を指定しないとインストールされているフォントをすべて読もうとして時間がかかります。今回はFont Awesomeだけ使えればいいのでそのファイル名を指定します。

library(extrafont)

import_font(pattern = "fontawesome-webfont.ttf")

fonts()"FontAwesome"が出てきたら正しくインポートされています。

fonts()
#> [1] "FontAwesome"

もしなにかおかしくなったら、extrafontdbパッケージを再インストールすると初期化されます。

install.packages("extrafontdb")

ggplotでフォント名を指定(family="FontAwesome"

ラベルに指定するのはUnicode文字です。例えば車だと、

Unicode: f1b9 · Created: v4.1 · Categories: ...
(http://fortawesome.github.io/Font-Awesome/icon/car/)

と書いてあるので、

"\uf1b9"

と書くか、または、いちど16進数としてIntegerに直して、それをUtf8に変換します。

intToUtf8((strtoi("f1b9", 16L)))

これを使うと、こんなグラフが描けます。

library(ggplot2)

ggplot(mtcars) + 
    geom_text(aes(mpg, wt, colour = factor(cyl)),
              label = "\uf1b9",
              family = "FontAwesome",
              size = 7)

f:id:yutannihilation:20150602235127p:plain

あんまり使いどころはない気もしつつ。とりあえずメモ。