お前は万物を geom_point() できる。

よくきたな。おれは逆噴射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のグラフィックデバイス周りのコードを読んでいて発見したものでした。奥が深い...