使用ggplot2中的虚拟变量突出显示句点

时间:2018-04-18 13:06:14

标签: r ggplot2 highlight dummy-variable

我有两个时间序列产量和fx和一个假人。如何在ggplot中绘制两个系列并突出显示(阴影)假人为1的区域?下面数据集的标题。

date    dummy   yield   fx
1/1/1990    0   10.029  1.261184049
1/2/1990    0   10.036  1.261008068
1/3/1990    0   10.119  1.258932591
1/4/1990    0   10.02   1.261410528
1/5/1990    0   10.013  1.261586847
1/6/1990    1   10.066  1.260255526
1/7/1990    1   10.057  1.260481006
1/8/1990    1   10.057  1.260481006
1/9/1990    1   10.067  1.260230488
1/10/1990   1   10.186  1.257272051

我尝试使用与下面的代码类似的rect,但这不起作用。

ggplot(dummies, aes(date)) + 
geom_line(aes(y = yield, colour = "yield")) + 
geom_line(aes(y = fx, colour = "fx")) +
geom_rect(aes(xmin=-Inf, xmax=Inf, ymin=0, ymax=1),
          colour=alpha("grey20", 0.5), fill.alpha=0.5)

非常感谢任何帮助。谢谢。

2 个答案:

答案 0 :(得分:1)

放手一搏:

library(tidyr)

dummies2<- gather(dummies, key="type", value="value", c("yield", "fx"))

ggplot(dummies2, aes(x=date, y=value, colour=type, group=type)) + 
  geom_segment(aes(y=-Inf, yend=Inf,x=date, xend=date, alpha=dummy),inherit.aes = F,colour="black", size=5)+
               scale_alpha_continuous(range=c(0,0.3))+
  guides(alpha=F)+
  geom_line()

(请注意,注释会在离散时间点上添加为标记。否则,也可以作为期间着色添加。

答案 1 :(得分:1)

如果您只有这一个需要加阴影的句号,我只会使用annotate。否则,您可以使用geom_rect来使用一些方法来拉动唯一的日期。

我将您的日期列转换为Date对象以获得更好的格式,并且能够使用minmax等功能。然后,虚拟数据位于单独的数据框中,该数据框针对dummy == 1的观察值进行过滤,其中日期是dummy == 1日期的第一个或最后一个。这使得注释的xminxmax成为可能。我将注释的ymin设置为0,但您可以将其设置为对数据有意义的任何内容。

我还看到了上面关于需要网格线可见的评论,所以我使用theme_light代替。如果它是一个问题,你可以改变网格线的颜色。

library(tidyverse)

# main data frame
df <- "date    dummy   yield   fx
1/1/1990    0   10.029  1.261184049
1/2/1990    0   10.036  1.261008068
1/3/1990    0   10.119  1.258932591
1/4/1990    0   10.02   1.261410528
1/5/1990    0   10.013  1.261586847
1/6/1990    1   10.066  1.260255526
1/7/1990    1   10.057  1.260481006
1/8/1990    1   10.057  1.260481006
1/9/1990    1   10.067  1.260230488
1/10/1990   1   10.186  1.257272051" %>% 
    read_table2() %>%
    mutate(date2 = lubridate::mdy(date)) %>%
    gather(key = measure, value = value, yield, fx)

head(df)
#> # A tibble: 6 x 5
#>   date     dummy date2      measure value
#>   <chr>    <int> <date>     <chr>   <dbl>
#> 1 1/1/1990     0 1990-01-01 yield    10.0
#> 2 1/2/1990     0 1990-01-02 yield    10.0
#> 3 1/3/1990     0 1990-01-03 yield    10.1
#> 4 1/4/1990     0 1990-01-04 yield    10.0
#> 5 1/5/1990     0 1990-01-05 yield    10.0
#> 6 1/6/1990     1 1990-01-06 yield    10.1

# dummy data frame: dummy == 1, only min & max dates
dummy <- df %>% 
    filter(dummy == 1) %>% 
    filter(date2 %in% c(min(date2), max(date2))) %>%
    select(dummy, date2) %>%
    unique()

ggplot(df, aes(x = date2, y = value, color = measure)) +
    annotate(geom = "rect", xmin = min(dummy$date2), xmax = max(dummy$date2), ymin = 0, ymax = Inf, fill = "gray", alpha = 0.4) +
    geom_line() +
    theme_light() 

reprex package(v0.2.0)创建于2018-04-18。