ggplot2使geom_tile中的缺失值不为空

mom*_*ara 18 r ggplot2

geom_tile()R的ggplot2数据可视化包中的层中,当单元格不包含任何数据时,不会绘制它.例如http://docs.ggplot2.org/current/geom_tile.html并搜索"缺失值".

我想更改此行为以显示所有切片的最小值.这有可能吗?如果可以的话怎么样?

附加背景:我使用的时候

stat_density2d(aes(x=x,y=y, fill=..density..), geom="tile", contour=FALSE)
Run Code Online (Sandbox Code Playgroud)

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

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

Tri*_*ou. 26

如果您的数据是类似网格的数据,那么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)
Run Code Online (Sandbox Code Playgroud)

一个例子

  • 我尝试了代码,但NA的传说没有出现.. ggplot2的作者在这篇文章中也提到了这一点:https://groups.google.com/forum/#!topic /ggplot2/MbYp5K03X3w那么怎么办你得到那个NA传奇? (2认同)

Bis*_*est 14

此问题也可以通过scale_fill_continuous中的选项修复

scale_fill_continuous(na.value = 'salmon')
Run Code Online (Sandbox Code Playgroud)

编辑如下:

这仅显式填充(即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')
Run Code Online (Sandbox Code Playgroud)

一个简单的解决方法是使用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')
Run Code Online (Sandbox Code Playgroud)

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


mom*_*ara 6

对于后代,这是与ggplot21.9.3版兼容的正确解决方案

+ theme(panel.background=element_rect(fill="blue", colour="blue")
Run Code Online (Sandbox Code Playgroud)
  • 在joran的回答中,plot.background整个情节包括标题和图例等.这panel.background是数据出现的区域.

  • 在最新版本的ggplot2中,opts已被替换themetheme_rect已被替换element_rect.

  • 在指定时element_rect,color是矩形的边界,而矩形fill的内部是.

我原来用过的,

+ geom_rect(aes(xmin=-Inf, xmax=Inf, ymin=-Inf, ymax=Inf), fill="blue")
Run Code Online (Sandbox Code Playgroud)

但是当添加geom_raster而不是geom_tile在背景上并生成pdf输出时,pdf查看器很难渲染绘图,使用更多的CPU周期和内存.