今回の記事は、昔の記事「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
を再利用します。
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)
綺麗なグラデーションになりました!