2017-06-19 16 views
1

グローバルマップ(ラスタファイル)をいくつかプロットしようとしていますが、データのカラースケールを設定する際に問題があります。私がしたいのは、分散したパレット(例えばcm.colors)を使ってデータをプロットすることです。スケール0でこのようなスケールの色を白にしたいのですが、スケールに対称値を設定する必要はありませんすなわち、負と正の両方の同じ値、すなわちlimits=c(-1,1))。さらに、すべての値を特定の値の上および/または下にすべて同じ色でプロットしたいと思います。ggplot2:連続カラースケールを設定して極値を扱う

つまり、マップの範囲が-100〜150の場合、値0に対応する「白」の色を持つ発散するパレットでマップをプロットしたいと思います。例えば-20より下で50より上の値は、同じ色、すなわち、それぞれカラーパレットの負および正の極値でプロットされている。

ここで私は一瞬のために使用していたコードの例:

ggplot(df, aes(y=Latitude, x=Longitude)) + 
    geom_raster(aes(fill=MAP)) + 
    coord_equal()+ 
    theme_gray() + 
    theme(panel.background = element_rect(fill = 'skyblue2', colour = 'black'), 
     panel.grid.major = element_blank(), 
     panel.grid.minor = element_blank(), 
     legend.position = "right", 
     legend.key = element_blank()) + 
    scale_fill_gradientn("MAP", limits=c(-0.5,1), colours=cm.colors(20)) 

答えて

2

ように事前にデータを切り捨て、または適切なラベルのための個別のビンを作成するためにcutを使用するなど、これを実現するための簡単な方法があります。

require(dplyr) 
df %>% mutate(z2 = ifelse(z > 50, 50, ifelse(z < -20, -20, z))) %>% 
    ggplot(aes(x, y, fill = z2)) + geom_tile() + 
    scale_fill_gradient2(low = cm.colors(20)[1], high = cm.colors(20)[20]) 

enter image description here

df %>% mutate(z2 = cut(z, c(-Inf, seq(-20, 50, by = 10), Inf)), 
       z3 = as.numeric(z2)-3) %>% 
    {ggplot(., aes(x, y, fill = z3)) + geom_tile() + 
    scale_fill_gradient2(low = cm.colors(20)[1], high = cm.colors(20)[20], 
         breaks = unique(.$z3), labels = unique(.$z2))} 

enter image description here

しかし、私は前にこのタスクについて考え、そしてそれに不満を感じたのです。事前打ち切りではラベルが残っていないので、cutのオプションは常に厄介です(特にseqのパラメータをcutに調整してビンを再センタリングする方法を理解する必要があります)。だから私は、あなたのために切り捨てと再ラベル付けを行う再利用可能な変換を定義しようとしました。

私はこれを完全にデバッグしていないので、私は町を出るので、うまくいけば、あなたまたは別の回答者がそれに亀裂を入れることができます。主な問題は、エッジの場合の衝突であるように見えるため、意図したブレークと視覚的に重複することがあります。私はちょうどそれをテストするために-100から150のあなたの望ましい範囲を作成するためにいくつかのダミーのデータを使用しました。

enter image description here

require(scales) 
trim_tails <- function(range = c(-Inf, Inf)) trans_new("trim_tails", 
       transform = function(x) { 
        force(range) 
        desired_breaks <- extended_breaks(n = 7)(x[x >= range[1] & x <= range[2]]) 
        break_increment <- diff(desired_breaks)[1] 
        x[x < range[1]] <- range[1] - break_increment 
        x[x > range[2]] <- range[2] + break_increment 
        x 
       }, 
       inverse = function(x) x, 

       breaks = function(x) { 
        force(range) 
        extended_breaks(n = 7)(x) 
       }, 
       format = function(x) { 
        force(range) 
        x[1] <- paste("<", range[1]) 
        x[length(x)] <- paste(">", range[2]) 
        x 
       }) 

ggplot(df, aes(x, y, fill = z)) + geom_tile() + 
    guides(fill = guide_colorbar(label.hjust = 1)) + 
    scale_fill_gradient2(low = cm.colors(20)[1], high = cm.colors(20)[20], 
         trans = trim_tails(range = c(-20,50))) 

もちょうど完全に応答ブライアンを肉付け、 ... + guides(fill = guide_legend(label.hjust = 1, reverse = T)) + ...

enter image description here

+0

グレート使用し、代わりにカラーバーの箱入り伝説で動作します。ありがとう。私は今それを必要としませんが、私はその変換が非常に便利であることがわかりました。 – SeldomSeenSlim

関連する問題