web-dev-qa-db-ja.com

ggplot2はgeom_tileの欠落値を空白ではないようにします

Rのggplot2データ視覚化パッケージのgeom_tile()レイヤーで、セルにデータが含まれていない場合、セルは描画されません。例えば。 http://docs.ggplot2.org/current/geom_tile.html そして「不足している値」を検索します。

この動作を変更して、すべてのタイルの最小値を表示したいと思います。これは可能ですか?もしそうなら、どのように?

追加のコンテキスト:使用する場合

stat_density2d(aes(x=x,y=y, fill=..density..), geom="tile", contour=FALSE)

密度のない領域は、密度の低い領域と非常によく似ているように見せたいです。現在のように、カラースペクトルが青から赤で、背景が白の場合、タイルにデータがない場合は白になり、タイルにデータポイントが1つある場合は青になります。

データに疑似カウントを追加することは可能のようですが、疑似カウントを分散する方法を事前に知るにはどうすればよいですか?ファセットがある場合は?

20
momeara

この問題は、scale_fill_continuousのオプションでも修正できます。

scale_fill_continuous(na.value = 'salmon')

以下を編集してください:

これは、明示的に(つまり、NAである値)欠落している値のみを埋めます。 (以前のバージョンのggplotでは動作が異なっていた可能性があります。怠惰すぎて確認できません)

例については、次のコードを参照してください。

library(tidyverse)
Data <- expand.grid(x = 1:5,y=1:5) %>%
  mutate(Value = rnorm(25))

Data %>%
  filter(y!=3) %>%
ggplot(aes(x=x,y=y,fill=Value))+
  geom_tile()+
  scale_fill_continuous(na.value = 'salmon')

Data %>%
  mutate(Value=ifelse(1:n() %in% sample(1:n(),22),NA,Value)) %>%
  ggplot(aes(x=x,y=y,fill=Value))+
  geom_tile()+
  scale_fill_continuous(na.value = 'salmon')

これに対する簡単な修正は、完全な関数を使用して欠落している値を明示的にすることです。

Data %>%
  filter(1:n() %in% sample(1:n(),22)) %>%
  complete(x,y) %>%
  ggplot(aes(x=x,y=y,fill=Value))+
  geom_tile()+
  scale_fill_continuous(na.value = 'salmon')

場合によっては、拡張機能の方が完全な機能よりも便利な場合があります。

13
Bishops_Guest

データがグリッドのようなデータである場合、geom_tile()によってNAに別のsubset()を追加するのはどうですか?

# Generate data
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)
  df
}
pp20 <- pp(20)[sample(20*20, size = 200),]

df_grid  <- expand.grid(x = unique(pp20$x), y = unique(pp20$x))
df_merge <- merge(pp20, df_grid, by = c("x", "y"), all = TRUE)

# Missing values
ggplot(df_merge, aes(x = x, y = y)) +
  geom_tile(data = subset(df_merge, !is.na(z)), aes(fill = z)) +
  geom_tile(data = subset(df_merge,  is.na(z)), aes(colour = NA),
    linetype = 0, fill = "pink", alpha = 0.5)

an example

25
Triad sou.

後世のために、ここにggplot2バージョン1.9.3と互換性のある正しいソリューションがあります

+ theme(panel.background=element_rect(fill="blue", colour="blue")
  • Joranの回答では、plot.backgroundは、タイトルや凡例などを含むプロット全体です。panel.backgroundは、データが表示される領域です。

  • Ggplot2の最新バージョンでは、optsthemeに置き換えられ、theme_rectelement_rectに置き換えられました。

  • element_rectを指定する場合、colorは長方形の境界であり、fillは長方形の内部です。

私はもともと使っていました、

+ geom_rect(aes(xmin=-Inf, xmax=Inf, ymin=-Inf, ymax=Inf), fill="blue")

しかし、バックグラウンドにgeom_rasterではなくgeom_tileを追加して、pdf出力を生成すると、PDFビューアは、かなり多くのCPUサイクルとメモリを使用して、プロットをレンダリングするのに非常に苦労しました。

6
momeara

この答えはおそらく少し「かわいい」かもしれませんが、1つの解決策は、プロットの背景色を単にスケールの最小色に変更することでしょうか?例えば:

+ opts(plot.background = theme_rect(colour = "blue")

プロットの構造がより複雑で、これが発生したくない領域の背景が青くなる場合は、最初にgeom_rectレイヤーをプロットして、データの範囲のみに拡張することができます。

4
joran