Jay*_*Jay 1 r ggplot2 facet-grid
我有一个多变量纵向样本,我正在一个大的 facet_grid 中绘制,特别是使用 facet_grid,这样当我没有某个样本的某个时间点时,它仍然将所有内容保存在一个有序的网格中。我正在尝试向空构面添加某种指标,以表明它们没有数据(而不仅仅是没有点显示),因为有时空构面是尚未收集该样本的结果。我能够得到的是一个标签,它出现在有数据的每个方面,但我似乎无法弄清楚如何获得一个出现在没有数据的每个方面的标签。如果我可以通过选择的方面添加一个红色的 X,或者其他一些“无可用数据”的指示,而不是文本标签,如果您对此也有建议,那就更好了。
ggplot(mpg, aes(displ, cty)) + geom_point() +
facet_grid(vars(drv), vars(cyl)) + geom_text(x = 5, y = 20, label = "Blah")
Run Code Online (Sandbox Code Playgroud)
您可以使用 为缺少的组合添加行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)
Run Code Online (Sandbox Code Playgroud)
对于“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))
Run Code Online (Sandbox Code Playgroud)
或者我们可以使用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))
Run Code Online (Sandbox Code Playgroud)
以上可以通过对 的单个调用完成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))
Run Code Online (Sandbox Code Playgroud)