11

下の右の写真のような2Dカラーグラデーションの長方形を作成したいと思います。Rでこれを行うにはどうすればよいですか?colorRampまたはRColorBrewer他の関数/パッケージを使用して、素敵な1Dドーラーランプを作成できます。しかし、たとえば右上の長方形のように、コーナーにいくつかの色を含む2Dに対してこれを行うにはどうすればよいですか?

カラーグラデーション

私が取得したいのは、たとえば次の2つのグラデーションタイプです。

ここに画像の説明を入力してください ここに画像の説明を入力してください

BTY:上記のチャート(Luca Fenuが作成)をここで見つけたことを完全に忘れました。

4

4 に答える 4

9

これを試して:

 m = tcrossprod(sin(seq(0,pi,length=1e2)), cos(seq(0, 3*pi, length=1e2)))
 cols = matrix(hcl(h=scales::rescale(m, c(0, 360))), nrow(m))
 grid::grid.raster(cols)

必要なカラーグラデーションを表す関数を見つける必要があります(説明には正弦波を使用しました)。

ここに画像の説明を入力してください

編集:4つのコーナー間の線形補間

library(grid)
library(scales)

m = tcrossprod(seq(1,2,length=1e2), seq(2, 3, length=1e2))
pal <- gradient_n_pal(c("red","green","yellow","blue"), values = c(2, 3, 4, 6), space = "Lab")
cols = matrix(pal(m), nrow(m))
grid.raster(cols)

ここに画像の説明を入力してください

編集2:関数が分離できない場合は、outerを使用します。

fun_xy <- function(x, y){

  abs(y-x) * abs(y+x)

}

z <- outer(seq(-1,1,length=100), seq(-1,1,length=100), FUN = fun_xy)

cols = matrix(hcl(h=scales::rescale(z, c(0, 200))), nrow(z))
grid::grid.raster(cols)

ここに画像の説明を入力してください

後で値をカラースケールにマッピングする代わりに、関数内で直接混色を行うこともできます。

fun_xy <- function(x, y){

  R <- (x+1)/2
  G <- (1-x)/2
  B <- (y+1)/2
  A <- 1- 0.5*exp(-(x^2+y^2)/0.2)

  rgb(R, G, B, A)

}

z <- outer(seq(-1,1,length=100), seq(-1,1,length=100), FUN = fun_xy)

library(grid)
grid.newpage()
grid::grid.raster(z)

ここに画像の説明を入力してください

于 2012-06-17T09:28:03.813 に答える
7

私の投稿にコメントしていただきありがとうございます - 議論が生まれてよかったです。右上のプロットを実現するための最小限のコードを次に示します。他にもっと効率的な方法があると思います...しかし、これは他のライブラリを必要とせずに機能し、従うのに十分簡単なはずです...変更できますmax_sat 変数と alpha_default 変数をいじって、彩度とアルファ ブレンディング...

#define extremes of the color ramps
rampk2r <- colorRampPalette(c(rgb(  0/255,   0/255,   0/255), rgb(218/255,   0/255,   0/255)))
rampk2g <- colorRampPalette(c(rgb(  0/255,   0/255,   0/255), rgb(  0/255, 218/255,   0/255)))

# stupid function to reduce every span of numbers to the 0,1 interval
prop <- function(x, lo=0, hi=100) {
    if (is.na(x)) {NA}
    else{
        min(lo,hi)+x*(max(lo,hi)-min(lo,hi))
    }
}

rangepropCA<-c(0,20)
rangepropCB<-c(0,20)

# define some default variables
if (!exists('alpha_default')) {alpha_default<-1} # opaque colors by default
if (!exists('palette_l')) {palette_l<-50} # how many steps in the palette
if (!exists('max_sat')) {max_sat<-200} # maximum saturation
colorpalette<-0:palette_l*(max_sat/255)/palette_l # her's finally the palette...

# first of all make an empy plot
plot(NULL, xlim=rangepropCA, ylim=rangepropCB, log='', xaxt='n', yaxt='n', xlab='prop A', ylab='prop B', bty='n', main='color field');
# then fill it up with rectangles each colored differently
for (m in 1:palette_l) {
    for (n in 1:palette_l) {
        rgbcol<-rgb(colorpalette[n],colorpalette[m],0, alpha_default);
        rect(xleft= prop(x=(n-1)/(palette_l),rangepropCA[1],rangepropCA[2]) 
            ,xright= prop(x=(n)/(palette_l),rangepropCA[1],rangepropCA[2])
            ,ytop= prop(x=(m-1)/(palette_l),rangepropCB[1],rangepropCB[2]) 
            ,ybottom= prop(x=(m)/(palette_l),rangepropCB[1],rangepropCB[2])
            ,col=rgbcol
            ,border="transparent"
        )
    }
}
# done!
于 2012-06-19T14:42:39.473 に答える