下記文献をもとに滑らかな色付けを実行します。
まずは前回説明した Histogram coloring によるマンデルブロ集合を再掲します。
mandelbrot()
関数の中身は省略します。知りたい方は 初回の記事
を参照ください。
library(tidyverse)
m1 <- mandelbrot()
### Histogram coloring ###
h <- m1 %>%
filter(!is.na(iter)) %>% ## NA を除外
count(iter) %>% ## iterの値毎に個数をカウント
mutate(n=cumsum(n)) %>% ## 累積和を求める
mutate(n=n/max(n)) ## 値域を[0,1]にする
m1 %>%
left_join(h, by='iter') %>%
mutate(n=if_else(is.na(iter), NA_real_, n)) %>%
ggplot() +
aes(x=Re(c), y=Im(c), fill=n) +
geom_raster() +
scale_fill_gradientn(colors=rainbow(7), na.value='black') +
coord_fixed(ratio=1)
上の図は、前回の記事で指摘したように多くの色が使用されているが、綺麗な虹色にはなっていません。iter値が整数であるため、滑らかな色の変化にはならず、色の帯として現れます。
下の図は、Continuous (smooth) coloring と Histogram coloring を適用したものです。滑らかな虹色になっています。
### Continuous (smooth) coloring ###
m2 <- m1 %>%
mutate(z=z^2+c, iter=iter+1) %>%
mutate(z=z^2+c, iter=iter+1) %>%
mutate(iter2=iter-log10(log10(Mod(z)))/log10(2))
### Histogram coloring ###
h <- m2 %>%
filter(!is.na(iter2)) %>% ## NA を除外
count(iter2) %>% ## iterの値毎に個数をカウント
mutate(n=cumsum(n)) %>% ## 累積和を求める
mutate(n=n/max(n)) ## 値域を[0,1]にする
m2 <- m2 %>%
left_join(h, by='iter2') %>%
mutate(n=if_else(is.na(iter2), NA_real_, n))
ggplot(m2) +
aes(x=Re(c), y=Im(c), fill=n) +
geom_raster() +
scale_fill_gradientn(colors=rainbow(7), na.value='black') +
coord_fixed(ratio=1)
0 件のコメント:
コメントを投稿