2011-12-23 16 views
1

プロット(x、y)散布図をプロットする必要がありますが、ポイントは連続変数zの値に基づいて色分けされています。カラーコード別の値に基づく散布図 - いいえggplot

温度パレット(濃い青色から明るい赤色)が欲しいです。私はRcolorbrewerで試してみましたが、RdBuパレット(温度パレットに似ています)は非常に悪い中間値に白を使用しています。

色のサンプルと対応する値で色分けを説明する凡例をプロットしたいと思います。

これはRで簡単に実行できるのですか?いいえggplotしてください!ここでは誰も

+0

ggplot ... hmm格子はどうですか? – dickoa

+0

それを試すことができますが、私はrベースのソリューションを感謝します。 – ECII

答えて

5

ビルあなたはfilled.contourためのコードでのぞき見を取る場合、あなたは伝説を行うことができます。

このようなプロットを生成
x <- runif(40) 
y <- runif(40) 
z <- runif(40) 
scatter.fill(x,y,z,nlevels = 40,pch = 20) 

enter image description here

我々はこれを取得

scatter.fill <- function (x, y, z, 
           nlevels = 20, plot.title, plot.axes, 
           key.title, key.axes, asp = NA, xaxs = "i", 
           yaxs = "i", las = 1, 
           axes = TRUE, frame.plot = axes, ...) 
    { 
     mar.orig <- (par.orig <- par(c("mar", "las", "mfrow")))$mar 
     on.exit(par(par.orig)) 
     w <- (3 + mar.orig[2L]) * par("csi") * 2.54 
     layout(matrix(c(2, 1), ncol = 2L), widths = c(1, lcm(w))) 
     par(las = las) 
     mar <- mar.orig 
     mar[4L] <- mar[2L] 
     mar[2L] <- 1 
     par(mar = mar) 

     #Some simplified level/color picking 
     levels <- seq(min(z),max(z),length.out = nlevels) 
    col <- colorRampPalette(c("blue","red"))(nlevels)[rank(z)] 

     plot.new() 
     plot.window(xlim = c(0, 1), ylim = range(levels), xaxs = "i", 
      yaxs = "i") 
    rect(0, levels[-length(levels)], 1, levels[-1L], col = colorRampPalette(c("blue","red"))(nlevels) 
     if (missing(key.axes)) { 
      if (axes) 
       axis(4) 
     } 
     else key.axes 
     box() 
     if (!missing(key.title)) 
      key.title 
     mar <- mar.orig 
     mar[4L] <- 1 
     par(mar = mar) 

     #Simplified scatter plot construction 
     plot(x,y,type = "n") 
     points(x,y,col = col,...) 

     if (missing(plot.axes)) { 
      if (axes) { 
       title(main = "", xlab = "", ylab = "") 
       Axis(x, side = 1) 
       Axis(y, side = 2) 
      } 
     } 
     else plot.axes 
     if (frame.plot) 
      box() 
     if (missing(plot.title)) 
      title(...) 
     else plot.title 
     invisible() 
    } 

そしてベンの例からコードを適用する:私はこのように見えるように離れてその機能をハッキング

公正な警告、私は実際にfilled.contourのコードをハックしました。残りのコードを調べて、未使用のビットを削除するか、機能しなくなった部分を修正することをお勧めします。

+0

ありがとうございました。カラーボックスの黒い水平線を取り除くことは可能ですか? – ECII

+1

@ ECIIはい。それらは 'rect'で描かれます。 'rect'の' border'引数を参照してください。 – joran

+0

ありがとうございました。しかし、私はコードに何か問題があると思います。プロット例scatter.fill(x、y、y)... – ECII

5

デフォルトパッケージ(ベース、グラフィックス、grDevices)とそれを達成するためのいくつかの自家製のコードへ

季節の挨拶:StanLeについては

# Some data 
x <- 1:1000 
y <- rnorm(1000) 
z <- 1:1000 

# colorRamp produces custom palettes, but needs values between 0 and 1 
colorFunction <- colorRamp(c("darkblue", "black", "red")) 
zScaled <- (z - min(z))/(max(z) - min(z)) 

# Apply colorRamp and switch to hexadecimal representation 
zMatrix <- colorFunction(zScaled) 
zColors <- rgb(zMatrix, maxColorValue=255) 

# Let's plot 
plot(x=x, y=y, col=zColors, pch="+") 

は、ここに対応する伝説です(することがlayoutまたは類似したもの)によって追加:

# Resolution of the legend 
n <- 10 

# colorRampPalette produces colors in the same way than colorRamp 
plot(x=NA, y=NA, xlim=c(0,n), ylim=0:1, xaxt="n", yaxt="n", xlab="z", ylab="") 
pal <- colorRampPalette(c("darkblue", "black", "red"))(n) 
rect(xleft=0:(n-1), xright=1:n, ybottom=0, ytop=1, col=pal) 

# Custom axis ticks (consider pretty() for an automated generation) 
lab <- c(1, 500, 1000) 
at <- (lab - min(z))/(max(z) - min(z)) * n 
axis(side=1, at=at, labels=lab) 
+0

これに凡例を追加するのはどうですか? – StanLe

+0

凡例を含めるように編集しました。 – maressyl

2

これは合理的な解決策である - 私は出発点のための青ではなく、ダークブルーを使用していますが、することができます?rgbなどをチェックして好みの色に調整してください。 @ BenBolkerの答えのオフ

nbrk <- 30 
x <- runif(20) 
y <- runif(20) 
cc <- colorRampPalette(c("blue","red"))(nbrk) 
z <- runif(20) 
plot(x,y,col=cc[cut(z,nbrk)],pch=16)