R用geom_rug反转ggplot中的小线

时间:2019-07-02 11:48:40

标签: r ggplot2

我有一个包含2列的数据框:date和var1。 现在,我想在ggplot中绘制这两个变量,并用geom_rug()添加小行。

df<-tibble(date=lubridate::today() -0:14,
           var1= c(1,2.5,NA,3,NA,6.5,1,NA,3,2,NA,7,3,NA,1))

df%>%ggplot(aes(x=date,y=var1))+
  geom_point()+
  geom_rug(sides = "tr",outside = T) +
  # Need to turn clipping off if rug is outside plot area
  coord_cartesian(clip = "off")

这是我的情节:

enter image description here

但是我的问题是var1的细线在左侧。我想把它们放在顶部。

使用参数sides=,您可以更改小行的布置,如下所示:

df%>%ggplot(aes(x=date,y=var1))+
  geom_point()+
  geom_rug(sides = "t",outside = T) +
  # Need to turn clipping off if rug is outside plot area
  coord_cartesian(clip = "off")

但是在此示例中,细线代表date而不是var1。 (var1只有10个值,但有15条小线) 有人可以帮助我,如何反转geom_rug元素并避免此问题?

enter image description here

2 个答案:

答案 0 :(得分:3)

您在df$vardf$date中确实有15行。在前者中,有5个是NA

一种解决方法是定义一个有限的数据集,该数据集仅包含与绘制内容有关的信息(而不是NA)。这应该提供给geom_rug。使用complete.cases,我们可以省略数据集中带有NA的行。

您可以使用以下代码来完成所需的绘图

library(ggplot2)
library(tibble)
library(dplyr)

df %>% ggplot(aes(x = date, y = var1)) +
  geom_point() +
  geom_rug(data = df[complete.cases(df), ] ,    ## selected date: not NA
    sides = "lt",
    outside = TRUE) +
  coord_cartesian(clip = "off")

enter image description here

请让我知道这是否是您想要的。

答案 1 :(得分:2)

如果要在绘图时删除所有带有NA值的个案,另一种选择是使用ggplot2 remove_missing()函数:

df %>% ggplot(data = remove_missing(.), mapping = aes(x=date,y=var1))+
  geom_point()+
  geom_rug(sides = "t",outside = T) +
  coord_cartesian(clip = "off")