ggplot2使geom_tile中的缺失值不为空

时间:2011-08-02 02:24:43

标签: r ggplot2

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

我希望没有密度的区域与密度非常小的区域非常相似。就像现在一样,如果说色谱是从蓝色到红色而背景是白色的,那么当瓷砖中没有数据时它是白色的,并且当瓷砖中有单个数据点是蓝色时。

似乎可以为数据添加伪计数,但我如何提前知道如何分配伪计数?在有刻面的情况下?

4 个答案:

答案 0 :(得分:25)

如果您的数据是类似网格的数据,请按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

答案 1 :(得分:12)

此问题也可以通过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')

在某些情况下,扩展功能可能比完整功能更有用。

答案 2 :(得分:6)

对于后代,这是与ggplot2版本1.9.3

兼容的正确解决方案
+ theme(panel.background=element_rect(fill="blue", colour="blue")
  • 在joran的回答中,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查看器很难渲染绘图,使用更多的cpu周期和内存。

答案 3 :(得分:4)

这个答案可能有点过于“可爱”,但是一个解决方案是简单地将绘图的背景颜色更改为您的刻度中的最小颜色吗?例如:

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

如果您的绘图具有更复杂的结构,并且最终在您不希望发生这种情况的区域中将背景设置为蓝色,则可以首先绘制geom_rect图层,该图层将延伸到您的范围内仅数据。