よくきたな。おれは逆噴射yutannihi郎だ。
...みたいな文章を書きたかったけど、時間がないので手短に。小ネタ記事です。
ggplot2パッケージのgeom_point()
は散布図を描くための関数です。
この関数にはshape
というパラメータがあり、点の形を変えることができます。
こんな感じです(詳しくはAesthetic specifications • ggplot2を参照)。
library(ggplot2) d1 <- data.frame(x = 1:3, y = 0.5, shape = c(3, 14, 24)) d2 <- data.frame(x = 1:3, y = -0.5, shape = c("circle", "circle open", "circle filled")) ggplot(mapping = aes(x, y)) + # 数字で指定 geom_point(data = d1, aes(shape = shape), size = 50, fill = "red") + # 文字列で指定 geom_point(data = d2, aes(shape = shape), size = 50, fill = "blue") + scale_shape_identity() + expand_limits(x = c(0, 4), y = c(-1.5, 1.5)) + theme_void()
なんですけど、実は任意の文字をプロットできるって知ってました?
ggplot(mtcars, aes(wt, mpg)) + geom_point(aes(colour = factor(cyl)), shape = "忍", size = 18) + scale_color_viridis_d(option = "H") + ggtitle("◆2月22日はニンジャの日◆") + theme(title = element_text(size = 25))
Created on 2022-02-22 by the reprex package (v2.0.1)
これは、ggplot2の機能というよりもbase Rの仕様から来てるもので、base R で点を描画する関数 points()
のヘルプを読むと説明があります。
まず、Descriptionからして、
points
is a generic function to draw a sequence of points at the specified coordinates. The specified character(s) are plotted, centered at the coordinates.
と書かれています。一文目で「draw a sequence of points」と言っておきながら、その舌の根も乾かぬうちにプロットするのは「The specified character(s)」なのだとしれっと言っています。pointとは...
で、pch
というパラメータがshape
に当たるものですが、この説明を読むと、
Values of
pch
are stored internally as integers. The interpretation is
NA_integer_
: no symbol.0:18
: S-compatible vector symbols.19:25
: further R vector symbols.26:31
: unused (and ignored).32:127
: ASCII characters.128:255
native characters only in a single-byte locale and for the symbol font. (128:159
are only used on Windows.)-32
... Unicode code point (where supported).
となっていました。ちなみに、ユニコード文字を数字で指定する場合はどうやら UTF-16LE の codepoint を指定する必要があるっぽいのですが(参考)、大変すぎるので↑で見たように普通に文字を指定しましょう。じゃなくてふつうにgeom_text()
を使いましょう。
これは最近わけあってRのグラフィックデバイス周りのコードを読んでいて発見したものでした。奥が深い...