ggplot2 v3.4.0 から線の太さは size じゃなくて linewidth

ggplot2 の次のバージョン、3.4.0 が今年の夏~秋くらい?に出ます。変更点についてはまたリリースされたら詳しく眺めたいところですが(毎週火曜の22時から雑多なリリースノートを眺めるYouTube配信をやっています:yutannihilationのチャンネル (仮) - YouTube)、1点だけちょっと大きめの変更があるので先にお知らせ、ということで久々にブログを書いています。

何が変わったの?

タイトルに書いたのがすべてなんですが、これまで size

  • 点やテキストの大きさ
  • 線の太さ

の両方を表すのに使われてきましたが、次のバージョンから、線の太さは linewidth という変数でコントロールするようになります。

具体的には、以下のようなコードは

# size を直接指定
ggplot(economics, aes(date, unemploy)) +
  geom_line(size = 10)

# size を aes() でマッピング
ggplot(economics, aes(date, unemploy, size = uempmed)) +
  geom_line()

sizelinewidth に置き換えてください。

ggplot(economics, aes(date, unemploy)) +
  geom_line(linewidth = 10)

ggplot(economics, aes(date, unemploy, linewidth = uempmed)) +
  geom_line()

え、いきなりこの変更でかすぎない??

いきなり言われても過去のコードとか動かなくなると困りますよね。

ということで、v3.4.0 の時点では、「その書き方、古いよ」というメッセージが出ますが、 size は以前と同じように動作するようになっています。

library(ggplot2)

ggplot(economics, aes(date, unemploy)) +
  geom_line(size = 10)
#> size aesthetic has been deprecated for use with lines as of ggplot2 3.4.0
#> ℹ Please use linewidth aesthetic instead
#> This message is displayed once every 8 hours.

Created on 2022-07-03 by the reprex package (v2.0.1)

このメッセージはまだ警告ではないです。 今後これが徐々に、警告になって、エラーになって、という感じで強くなっていくものと思われます。 まあ、慎重にやると思うので、数年くらいはこのまま?、という気がしています。

なぜこんな変更を?

この変更のモチベーションは2つあります(ref: Rename size aesthetic for line-based geoms by thomasp85 · Pull Request #3672 · tidyverse/ggplot2 · GitHub)。

  1. 点と線を両方含む geom で、点の大きさと線の大きさを別々にコントロールすることができない。
  2. size を連続値にマッピングした場合、デフォルトだと面積に比例したスケールになってしまう。これは線に対しては不適切。

1点目について具体例を挙げると、以下のようなデータを geom_sf() で可視化しようとしたとき、 size を指定すると線も点も同時に変わってしまいます。

pt <- sf::st_point(c(2, 4))
ln <- sf::st_linestring(rbind(c(0, 1), c(5, 4)))
d <- sf::st_sf(id = 1:2, geometry = sf::st_sfc(pt, ln))

ggplot(d) +
  geom_sf(size = 10)

これが、これからは、sizelinewidth を使い分けて指定できるようになります。

ggplot(d) +
  geom_sf(size = 1, linewidth = 10)

まあこういう「点も線も両方」な geom はそれほど多くはないですが、geom_boxplot()geom_pointrange() などが該当します。

よくわかっていない点

これは ggplot2 本体だけの話で、独自の geom を提供しているパッケージは対応を入れる必要があります。 以下のような案内のブログ記事がリリース前に出るみたいですが、どれくらいのパッケージが追随するのか、予想しない使われ方をしていないか、というあたりまだよくわかっていません。 まあそんな大きな問題はないだろうと予想はしています。

まとめ

  • 線の太さを指定するときは linewidth になる
  • でも size でもしばらく(数年?)は動く
  • sizelinewidth をスマートに使い分けて快適な ggplot2 生活を