2017-07-10 6 views
0

私は絵のようにカラースケールをしたい:ggplot - ヒートカラーパレット

enter image description here

だから我々が持っている湖底する上から:

(白っぽい)黄色非常に明るい、オレンジ赤、黒、青、淡青色から非常に明るい青色(白い灰色)

常に0の値を「黒」として表示します。最も小さい(負の)値は「極端な明るい青色」でなければなりません。最大値(postive)は "極端な明るい笑い"でなければなりません。

最小値と最大値が原点から等距離ではないことに注意してください私は0

ザッツ:

library(ggplot2) 
df <- data.frame(xDim = c(0, 1, 2, 0, 1, 2, 0, 1, 2), yDim = c(2, 2, 2, 1, 1, 1, 0, 0, 0), high = c(0, -1, 6, -3, 8, 5, -2, 7, 5)) 

ggplot(df, aes(xDim, yDim)) + 
    geom_raster(aes(fill = high)) + 
    scale_fill_gradient2(low = "blue", mid = "black", high = "red", midpoint = 0) 
+0

'scale_fill_gradientn'を適切な区切りと色で代わりに使用します。 – Axeman

+0

それは本当です。それを自動化する方法はありますか?私は多くの異なる値を持つ多くのDFを持っています。 –

+0

'quantile'を使って区切りを設定することができます。 'viridis'カラーパレットも考えてみましょう:https://cran.r-project.org/web/packages/viridis/vignettes/intro-to-viridis.htmlパレットの中には、あなたが欲しいものに似ているようなものもあります'scale_fill_viridis(option =" plasma ")'で 'ggplot'に落とします。 –

答えて

1

scale_fill_gradientnは、このために最も適しています。適切な色のベクトルを取得するだけで、その色の値の範囲がわかります。

あなたのケースでは、我々は色として選択できます

col <- c('yellow', 'orange', 'red', 'black', 'blue', 'skyblue', 'white') 

、値など:

val <- c(seq(min(df$high), 0, length.out = 4), seq(0, max(df$high), length.out = 4)[-1]) 

私たちは、ドキュメントによるとrescale使用する必要があるので、私たちが行うには:

p <- ggplot(df, aes(xDim, yDim)) + 
    geom_raster(aes(fill = high)) + 
    scale_fill_gradientn(colours = col, values = scales::rescale(val)) 

cowplot::ggdraw() + cowplot::draw_plot(cowplot::get_legend(p)) 

enter image description here

+0

私はそれを使用して、それをちょっと微調整できると思います!いい –