繁体   English   中英

如何使用 ggplot2 facet_grid 注释没有数据的构面?

[英]How can I annotate facets that do not have data using 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")

示例图

您可以使用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的一次调用来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))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM