web-dev-qa-db-ja.com

ggplotスケールデータの範囲外の色のグラデーション

データセット内のデータ値の範囲に関係なく、2つの値の間のカラーグラデーションを引き伸ばして凡例にラベルを付ける方法を探しています。基本的に、色のグラデーションのylim()に相当する機能はありますか?

通常は-1と1の間のz値をプロットするコードを指定すると、ブレークがデータ範囲内にある場合、勾配をプロットしてラベルを付けることができます。

library(ggplot2)

#generator from http://docs.ggplot2.org/current/geom_tile.html
pp <- function (n, r = 4) { 
  x <- seq(-r * pi, r * pi, len = n)
  df <- expand.grid(x = x, y = x)
  df$r <- sqrt(df$x^2 + df$y^2)
  df$z <- cos(df$r^2) * exp(-df$r / 6)
  return(df)
}

t <- pp(30)
summary(t)
b <- c(-.5, 0, .5)
colors <- c('navyblue', 'darkmagenta', 'darkorange1')
p <- ggplot(data = t, aes(x = x, y = y))+
  geom_tile(aes(fill = z))+
  scale_fill_gradientn(colors = colors, breaks = b, labels = format(b))
ggsave(plot = p, filename = <somefile.png>, height = 3, width = 4)

graham jeffries ggplot scale fill example

しかし、ブレークを観測範囲外の値に変更すると、グラデーションの色が調整されず、グラデーションラベルが表示されません。

b <- c(-3, 0, 3)

graham jeffries ggplot scale fill example 2

28
metasequoia

Ggplotでは、breaksは基本的にスケール自体を変更しないことを覚えておくことが非常に重要です。ガイドまたは凡例に表示される内容のみが変更されます。

代わりにスケールの制限を変更する必要があります。

ggplot(data=t, aes(x=x, y=y)) +
  geom_tile(aes(fill=z)) +
  scale_fill_gradientn(limits = c(-3,3),
  colours=c("navyblue", "darkmagenta", "darkorange1"),
  breaks=b, labels=format(b))

そして、凡例に表示される区切りをさらに拡張したい場合は、それらを変更して目盛りが表示される場所を設定できます。

心に留めておくとよい類推は、常に通常のx軸とy軸です。そこに「ブレーク」を設定すると、目盛りが表示される場所が変わるだけです。 x軸またはy軸のextentを変更する場合は、通常、「制限」などの設定を変更します。

50
joran