R ggplot2 防止 vline 出现在空的 ggridge facet 中

问题描述

我正在尝试生成一个多面的山脊图,其中一些山脊是空的。下面的代码生成一个示例。

library(ggridges)
library(tidyverse)

df <- tibble(x = rnorm(1000,1,1),id = c(rep(1,600),rep(2,400)),year = c(rep(2000:2005,each = 100),rep(2000:2003,each = 100)))
df %>%
  ggplot(aes(x = x,y = as.factor(year))) + 
    geom_density_ridges2() +
    facet_grid(.~id) +
    geom_vline(xintercept = 0)

ggridges problem example

此处的垂直线贯穿第 2 方面中没有数据的年份。如何在 2003 年之后防止这种情况并阻止它?

解决方法

不是很漂亮,但您可以制作一个 df/tibble 来描述每个年份/id 组合的 geom_segment() 的参数。您可能需要进行一些调整以清理显示的区域(就像我在这里所做的那样使用 coord_cartesian()),但它可以满足您的需要。

enter image description here

library(ggridges)
library(tidyverse)

set.seed(123)

df <- tibble(x = rnorm(1000,1,1),id = c(rep(1,600),rep(2,400)),year = c(rep(2000:2005,each = 100),rep(2000:2003,each = 100)))

seg_df <-
  data.frame(
    x0 = 0,x1 = 0,6),4)),year = c(2000:2005,2000:2003)
  ) %>%
  group_by(id) %>%
  arrange(year) %>%
  mutate(y0 = row_number(),y1 = y0 + 1) %>%
  mutate(y0 = ifelse(y0 == 1,-1,y0)) %>%
  mutate(y1 = ifelse(y1 == max(y1),y1 + 1,y1))
seg_df

df %>%
  ggplot(aes(x = x,y = as.factor(year))) + 
  geom_density_ridges2() +
  facet_grid(.~id) +
  geom_segment(
    data = seg_df,mapping = aes(
      x = x0,xend = x1,y = y0,yend = y1
    ),inherit.aes = FALSE
  ) + coord_cartesian(ylim = c(1,length(unique(df$year)) + 1.2))