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()
size
を linewidth
に置き換えてください。
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)。
- 点と線を両方含む geom で、点の大きさと線の大きさを別々にコントロールすることができない。
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)
これが、これからは、size
と linewidth
を使い分けて指定できるようになります。
ggplot(d) + geom_sf(size = 1, linewidth = 10)
まあこういう「点も線も両方」な geom はそれほど多くはないですが、geom_boxplot()
や geom_pointrange()
などが該当します。
よくわかっていない点
これは ggplot2 本体だけの話で、独自の geom を提供しているパッケージは対応を入れる必要があります。 以下のような案内のブログ記事がリリース前に出るみたいですが、どれくらいのパッケージが追随するのか、予想しない使われ方をしていないか、というあたりまだよくわかっていません。 まあそんな大きな問題はないだろうと予想はしています。
If you develop extensions for ggplot2 and maintain a geom that should convert from "size" to "linewidth" there is precious little you need to do to be compliant: https://t.co/maeQicFJWb
— Thomas Lin Pedersen (@thomasp85) 2022年6月15日
まとめ
- 線の太さを指定するときは
linewidth
になる - でも
size
でもしばらく(数年?)は動く size
とlinewidth
をスマートに使い分けて快適な ggplot2 生活を