波形の関数を定義する

In [1]:
# シークエンスの波形を正規分布にする
wave_norm <- function (n){
    # 正規分布で十分0に近くなる範囲を求める
    x <- seq(0, 10, length.out = 100)
    l <- min(x[dnorm(x) < 0.05])

    x <- seq(-l, l, length.out = n)
    y <- dnorm(x)
    y <- y - min(y) # 最小値が0になるように
    y <- y / max(y) # 最大値が1になるように
}
In [2]:
# シークエンスの波形を放物線にする
wave_parabola <- function (n){
    x <- seq(-0.5, 0.5, length.out = n)
    1 - x^2 * 4
}

波形のデータ(x,y座標)を決める

In [3]:
# 一つの波
wx <- seq(-0.5, 0.5, length.out = 31)
wy <- wave_norm(length(wx))

塩基配列と色を決める

In [4]:
# ランダムに塩基配列を作成する
Ns <- c('A', 'T', 'C', 'G')
Ncolor <- c('green', 'red', 'blue', 'black')
seq_len <- 30
seq <- Ns[ceiling(runif(seq_len) * 4)]
In [5]:
# 特定の文字列を適当な色で書く
seq <- strsplit("PLANT MOLECULAR GENETICS&BIOINFORMATICS", "")[[1]]
seq_len <- length(seq)
Ns <- sort(unique(seq))
Ncolor <- c('gray', rainbow(length(Ns) - 1))  # 空白はgray

画像をつくる

In [7]:
# 波の高さに少し変化をつける
wr <- abs(rnorm(seq_len, mean = 1, sd = 0.1))
wr <- wr / max(wr)

# png画像をつくる
#png("bg_header_01.png", width=1080, height = 120, bg = 'transparent')
# 余白(cm)(maiは単位がインチなので2.54で割る)
options(repr.plot.width=10, repr.plot.height=2.5)
par(mai = c(0, 11, 1, 0) / 2.54, xpd = TRUE)

plot(wx, wy * max(wr), xlim = c(1, seq_len), type = 'n',
    axes = F, xlab = '', ylab = '', main = ''
)

# 波を描く
res <- sapply(1:seq_len, function (n){
    points(wx + n, wy * wr[n], type = 'l', col = Ncolor[which(seq[n] == Ns)], lwd = 2)
})

# 塩基を書く
text(1:seq_len, 1, seq, adj = c(0.5, -0.5))
#dev.off()