2025/01/14

マンデルブロ集合の彩色方法(2)

02.knit

Histogram coloringについて説明する。

参考文献: Histogram coloring (Wikipedia)

  • 反復回数(iter)の値に応じて着色する方法
  • 反復回数の頻度に応じて色をマッピングする

まずは、前回説明した「エスケープタイム」アルゴリズムによるマンデルブロ集合を再掲します。

mandelbrot()関数の中身は省略します。知りたい方は 前回の記事 を参照ください。

library(tidyverse)

m1 <- mandelbrot()

ggplot(m1) +
    aes(x=Re(c), y=Im(c), fill=iter) +
    geom_raster() +
    scale_fill_gradientn(colors=rainbow(7), na.value='black') +
    coord_fixed(ratio=1)

この図は色に偏りがあります。大部分は赤、オレンジ、黄色であり、緑色~紫色の部分は非常に少ない。これは図中の大部分がiter値10以下であることを意味しています。

反復回数(iter)についてヒストグラムを表示してみます。

m1 %>%
    filter(!is.na(iter)) %>%
    ggplot() +
    aes(x=iter) +
    geom_histogram()

確かに反復回数(iter)の大部分が10以下の値です。 できれば赤~紫までの色が均等に使われるようにしたいです。 これは Histogram coloring を使うとできます。

Histogram coloring の概要

  1. 反復回数(iter)の値毎に個数をカウントする
  2. 累積和を求める
  3. 値域を[1,0]にする
### Histogram coloring ###

h <- m1 %>%
    filter(!is.na(iter)) %>% ## NAを除外する
    count(iter) %>%          ## iterの値毎に個数をカウント
    mutate(n=cumsum(n)) %>%  ## 累積和を求める
    mutate(n=n/max(n))       ## 値域を[0,1]にする

ggplot(h) +
    aes(x=iter, y=n) +
    geom_line()

m2 <- m1 %>%
    left_join(h, by='iter') %>%
    mutate(n=if_else(is.na(iter), 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) +
    labs(title='Histogram coloring')

Histogram coloring により、多くの色が使用されるようになりました。しかし、綺麗な虹色とは言えません。これは反復回数(iter)が整数値であるために生じる現象です。上の図の赤色部分はiter=1を示しており、水色部分はiter=2を示しています。綺麗な虹色にするにはiter=1とiter=2の間を補完するような作業が必要です。この作業は次回紹介します。

0 件のコメント:

コメントを投稿

マンデルブロ集合の彩色方法(4)

04.knit 1 Binary Decomposition 下記文献に従い着色した。 参考文献: Binary Decompo...