2022/05/25

tidyverseでマンデルブロ集合を表示する

man2.knit

今回の記事は、昔の記事「R言語でマンデルブロ集合を表示する」を参考に、tidyverseを用いて書き換えてみたというお話です。

データフレーム化(tibble)することにより、より簡潔に記述でき、かつデータの再利用がしやすくなったような気がします。ggplot2による描画も良い感じです。

1 tidyverseによるマンデルブロ集合の計算

library(tidyverse)

center <- -0.75+0i   # 計算する範囲の中心座標
radius <- 1.25       # 計算する範囲の半径
resolution <- 640    # 計算する範囲の分割数
max.iteration <- 50  # 計算の反復回数上限
escape.radius <- 3.1 # 脱出半径(収束/発散判定)
x <- seq(Re(center)-radius, Re(center)+radius, length.out=resolution)
y <- seq(Im(center)-radius, Im(center)+radius, length.out=resolution)

m <- tibble(
    c=c(outer(x, y*1i, '+')),
    z=complex(1),
    k=numeric(1)
)

for (i in 1:max.iteration) {
    tmp <- Mod(m$z) < escape.radius
    m <- m %>%
        mutate(
            z=if_else(tmp, z * z + c, z),
            k=if_else(tmp, k+1, k)
        )
}

m %>%
    mutate(k=na_if(k, max.iteration)) %>%
    ggplot() +
    aes(x=Re(c), y=Im(c), fill=k) +
    geom_raster() +
    scale_fill_gradientn(colors=rep(rainbow(8), 5), na.value='black') +
    theme_void() +
    coord_fixed(ratio=1)

2 データ再利用例

下記文献をもとに滑らかな色付けを実行します。前章で計算したデータmを再利用します。

参考文献:Renormalizing the Mandelbrot Escape

lg2 <- log10(2.0)

m <- m %>%
    mutate(z=z*z+c, k=k+1) %>%
    mutate(z=z*z+c, k=k+1) %>%
    mutate(
        k2=if_else(
            Mod(z) > escape.radius,
            k-log10(log10(Mod(z)))/lg2,
            k
        )
    )

m %>%
    mutate(k2=if_else(k==max.iteration+2, NA_real_, k2)) %>%
    ggplot() +
    aes(x=Re(c), y=Im(c), fill=k2) +
    geom_raster() +
    scale_fill_gradientn(colors=rep(rainbow(8), 5), na.value='black') +
    theme_void() +
    coord_fixed(ratio=1)

綺麗なグラデーションになりました!

【備忘録】時系列データの編集方法(R言語, tidyverse)

TimeSeries.knit 1 サンプルデータ作成 2 日付単位に集計する 2.1 月毎集計 2.2 四半期毎集計 ...