ggplot2让geom_tile中的缺失值不为空白

35
在R的数据可视化包ggplot2中,geom_tile()层中,当一个单元格没有数据时,它不会被绘制。例如:http://docs.ggplot2.org/current/geom_tile.html并搜索“missing value”。
我想将此行为更改为显示所有瓷砖上的最小值。是否可能,如果是,怎么做?
额外的背景:当使用

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

我希望没有密度的区域看起来与密度非常低的区域非常相似。目前,如果颜色光谱从蓝色到红色,背景为白色,那么当瓦片中没有数据时它是白色的,当瓦片中有一个数据点时它是蓝色的。

添加一个虚拟计数到数据中似乎是可能的,但是如何预先确定如何分配这些虚拟计数呢?并且在有分面的情况下怎么办?


我不太确定您要找什么(提供一个可复现的示例将会很有帮助),但也许您可以尝试使用 +scale_fill_gradient(limits = c(0,...)) 并将“...”替换为适当的最大值? - joran
4个回答

40

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

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


你能发一个完整的例子吗?我无法让它工作(ggplot2 v3.0.0) - Quantum7

29

如果你的数据是类似网格状的数据,那么尝试通过subset()将NA添加到另一个geom_tile()中如何?

# 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


这似乎是一个合理的方法。谢谢! - momeara
3
我尝试了这段代码,但是“NA”的图例没有显示出来。 ggplot2的作者在这篇文章中也提到了这个问题:https://groups.google.com/forum/#!topic/ggplot2/MbYp5K03X3w。那么你是如何得到“NA”图例的呢? - olala
代码出现错误:"错误:必须从色调调色板中请求至少一种颜色",因为 "color = NA"。 - reggie

8

为了备份,这里提供了与 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

这个答案可能有点“可爱”,但是一个解决方案是将您的图表背景颜色更改为比例尺中的最小颜色。例如:

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

如果您的图形具有更复杂的结构,并且这最终导致背景在您不希望的区域变为蓝色,那么您可���先绘制一个geom_rect层,该层仅延伸到数据的范围。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接