餡子付゛録゛

ソフトウェア開発ツールの便利な使い方を紹介。

絵師が喜ぶかも知れないgraphics::xspline

Rではsmooth.spline,splinefun,pracma::pchipなどでスプライン補間を行うことができるのですが、予測値自体にさほど興味は無く、標準graphicsで図に線が描ければ十分なときは、低水準描画関数xsplineを使うことができます。

線を描く

x <- -2:2
y <- c(2.58, 0.18, -0.70,  1.30,  2.43)
plot(x, y)
lty <- c(2, 3)
col <- c("red", "blue")
# like cubic B-spline
xspline(x, y, shape = 1, lty = lty[1], border = col[1])
# like Catmull-Rom spline
xspline(x, y, shape = -1, lty = lty[2], border = col[2])
legend("top", legend = c("B-spline", "Catmull-Rom"), lty = lty, col = col, bty = "n")
xspline/open

shapeは1から-1の値をとるベクトルで、要素1でも動きますが、補定のもとになる各点ごとに指定することができます。0だと直線でノットを結び、1だとB-splineのように結び、-1だとCatmull-Romのように結びます。

線の色をcolではなくborderで指定するのには注意してください。

閉曲線を描く

open = FALSEを引数につけると、ぐるっと一周する線を描くこともできます。

x <- c(-2, 0, 2, 2, 0, -2)
y <- c(-2, -0.5, -2, 2, 0.5, 2)
lty <- c(2, 3)
col <- c("blue", "red")
plot(x, y, panel.first = {
  xspline(x, y, shape = -1, open = FALSE, lty = lty[1], border = col[1])
  xspline(x, y, shape = 1, open = FALSE, lty = lty[2], border = col[2])
}, bg = "white", pch = 21, xlim = c(-2.5, 2.5))
legend("top", legend = c("B-spline", "Catmull-Rom"), lty = lty, col = col, bty = "n")
xspline/close

borderで線色を、colで背景色を指定ができます。

座標を得る

draw = TRUEを引数につけると、描画せずにプロットする座標を得ることができます。

だいぶ前から存在

2007年のR 2.6.0から標準搭載なのですが、今日まで気づかなかったので反省をこめて。スプライン曲線を描きこむ機会はそうは無かったですが。