您可以使用full_join 为缺少的组合添加行。这些新行将没有数据,因此不会绘制任何内容,但您可以添加一个附加列,其中包含 geom_text 将使用的消息:
library(tidyverse)
theme_set(theme_bw())
mpg %>%
full_join(crossing(drv=unique(mpg$drv), cyl=unique(mpg$cyl))) %>%
mutate(empty=ifelse(is.na(model), "No data available", NA_character_),
x=mean(range(displ, na.rm=TRUE)),
y=mean(range(cty, na.rm=TRUE))) %>%
ggplot(aes(displ, cty)) +
geom_point() +
facet_grid(vars(drv), vars(cyl)) +
geom_text(aes(x, y, label=empty), colour="red", size=3)
对于“X”,将 empty 文本更改为 "X" 并用大尺寸绘制它。例如:
mpg %>%
full_join(crossing(drv=unique(mpg$drv), cyl=unique(mpg$cyl))) %>%
mutate(empty=ifelse(is.na(model), "X", NA_character_),
x=mean(range(displ, na.rm=TRUE)),
y=mean(range(cty, na.rm=TRUE))) %>%
ggplot(aes(displ, cty)) +
geom_point() +
geom_text(aes(x, y, label=empty), colour="red", size=20) +
facet_grid(vars(drv), vars(cyl))
或者我们可以使用geom_segment:
mpg %>%
full_join(crossing(drv=unique(mpg$drv), cyl=unique(mpg$cyl))) %>%
ggplot(aes(displ, cty)) +
geom_point() +
geom_segment(data=. %>% filter(is.na(model)),
x=min(mpg$displ), xend=max(mpg$displ),
y=min(mpg$cty), yend=max(mpg$cty),
colour="red") +
geom_segment(data=. %>% filter(is.na(model)),
x=min(mpg$displ), xend=max(mpg$displ),
y=max(mpg$cty), yend=min(mpg$cty),
colour="red") +
facet_grid(vars(drv), vars(cyl))
只需调用geom_segment 即可完成上述操作,但需要 (AFAICT) 更复杂的数据准备:
mpg %>%
full_join(crossing(drv=unique(mpg$drv), cyl=unique(mpg$cyl))) %>%
ggplot(aes(displ, cty)) +
geom_point() +
geom_segment(data=. %>%
filter(is.na(model)) %>%
select(-displ, -cty) %>%
crossing(
displ=range(mpg$displ),
cty=range(mpg$cty)
),
aes(xend=rev(displ), yend=rev(cty)), colour="red") +
facet_grid(vars(drv), vars(cyl))