ように事前にデータを切り捨て、または適切なラベルのための個別のビンを作成するために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])
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))}
しかし、私は前にこのタスクについて考え、そしてそれに不満を感じたのです。事前打ち切りではラベルが残っていないので、cut
のオプションは常に厄介です(特にseq
のパラメータをcut
に調整してビンを再センタリングする方法を理解する必要があります)。だから私は、あなたのために切り捨てと再ラベル付けを行う再利用可能な変換を定義しようとしました。
私はこれを完全にデバッグしていないので、私は町を出るので、うまくいけば、あなたまたは別の回答者がそれに亀裂を入れることができます。主な問題は、エッジの場合の衝突であるように見えるため、意図したブレークと視覚的に重複することがあります。私はちょうどそれをテストするために-100から150のあなたの望ましい範囲を作成するためにいくつかのダミーのデータを使用しました。
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)) + ...
グレート使用し、代わりにカラーバーの箱入り伝説で動作します。ありがとう。私は今それを必要としませんが、私はその変換が非常に便利であることがわかりました。 – SeldomSeenSlim