ggplot2 делает пропущенное значение в geom_tile не пустым - PullRequest
17 голосов
/ 02 августа 2011

В слое geom_tile() в пакете визуализации данных ggplot2 для R, когда ячейка не содержит данных, она не рисуется.Например, http://docs.ggplot2.org/current/geom_tile.html и поиск "пропущенного значения".

Я хотел бы изменить это поведение, чтобы отображать минимальное значение для всех плиток.Возможно ли это, и если да, то как?

Дополнительный контекст: когда я использую

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

, я бы хотел, чтобы области без плотности выглядели очень похоже на области с очень низкой плотностью.Как и сейчас, если, скажем, цветовой спектр от синего до красного, а фон белый, то там, когда в тайле нет данных, он белый, а когда в тайле есть одна точка данных, синий.

Добавление псевдосчета к данным представляется возможным, но как мне заранее узнать, как распределить псевдосчет?а в случае когда есть огранка?

Ответы [ 4 ]

25 голосов
/ 02 августа 2011

Если ваши данные похожи на сетку, как насчет добавления еще 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

12 голосов
/ 28 января 2016

Эта проблема также может быть исправлена ​​с помощью параметра 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')

Простое решение для этого заключается виспользуйте функцию complete, чтобы сделать пропущенные значения явными.

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')

В некоторых случаях функция расширения может оказаться более полезной, чем функция complete.

6 голосов
/ 24 февраля 2013

Для потомков, вот правильное решение, совместимое с ggplot2 версия 1.9.3

+ theme(panel.background=element_rect(fill="blue", colour="blue")
  • В ответе Джорана plot.background - это весь сюжет, включая заголовок, легенду и т. Д. panel.background - это область, где появляются данные.

  • В последней версии ggplot2 opts был заменен на theme, а theme_rect был заменен на element_rect.

  • При указании element_rect, color - это граница прямоугольника, а fill - внутренняя часть прямоугольника.

Я изначально использовал,

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

, но при добавлении geom_raster вместо geom_tile поверх фона и генерации pdf выводщикам pdf было очень сложно визуализировать график, используя значительно больше циклов ЦП и памяти.

4 голосов
/ 02 августа 2011

Этот ответ может быть слишком «милым», но может ли одно решение просто изменить цвет фона вашего графика, чтобы он стал минимальным цветом в вашей шкале?Например:

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

Если ваш график имеет более сложную структуру, и это приводит к тому, что фон становится синим в областях, где вы этого не хотите, сначала вы можете нанести слой geom_rect, которыйраспространяется только на диапазоны ваших данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...