课程日期 x 轴上的 ggplot geom_vline

Posted

技术标签:

【中文标题】课程日期 x 轴上的 ggplot geom_vline【英文标题】:ggplot geom_vline on x-axis of class date 【发布时间】:2020-02-05 20:48:27 【问题描述】:

我正在尝试在 x 轴由日期组成的函数中添加 geom_vline。该图显示了挪威克朗兑欧元,垂直线应该显示在政策利率变化的日期。以下代码不显示竖线:

nok_eur_plot <- function(nok_eur_data, regression_method) 
  g <- ggplot(
      nok_eur_data, 
      aes(x = Date, y = NOK_EUR)
      ) + 
    geom_smooth(method = regression_method) +
    geom_point() + 
    labs(
      x = "Date", 
      y = paste("NOK per EUR for the last", length(nok_eur_data$NOK_EUR), "working-days", sep = " "),
      title = "NOK per EUR",
      subtitle = paste("From", min(nok_eur_data$Date), "to", max(nok_eur_data$Date), sep = " ")
      ) + 
    theme(
      axis.title.y = element_text(color = "blue")
      )

  rate_changes <- nok_key_policy_rate_change(length(nok_eur_data$NOK_EUR))

  for(row in 1:nrow(rate_changes)) 
    g + geom_vline(xintercept = rate_changes$Date[row], color = "red", size = 1, linetype = 4)
  

  plot(g)

结果是这样的:

我试过改

xintercept = rate_changes$Date[row]

xintercept = as.numeric(rate_changes$Date[row])

xintercept = as.POSIXct(rate_changes$Date[row])

按照here 的建议,但无济于事。我检查了图中显示的日期范围内是否存在汇率变化,其中有 3 个。

整个 Rmd 脚本如下所示:

```r setup, include=FALSE
knitr::opts_chunk$set(echo = TRUE)
library("xml2")
library("dplyr")
library("ggplot2")
library("scales")
```

## NOK vs EUR Regression

```r, results='asis'
analysis_periods <- c(10,100,200)

nok_eur <- function(days) 

  url_to_read <- paste(
    "https://data.norges-bank.no/api/data/EXR/",
    "B.EUR.NOK.SP?lastNObservations=",
    days,
    sep = ""
  )

  nok_eur_obs <- read_xml(url_to_read) %>%
    xml_find_all("//Obs")

  dates_closed <- nok_eur_obs %>% 
    xml_attr("TIME_PERIOD") %>% 
    as.Date("%Y-%m-%d")

  nok_eur_daily <- nok_eur_obs %>% 
    xml_attr("OBS_VALUE") %>% 
    as.numeric()

  nok_eur_data <- data.frame(x = dates_closed, y = nok_eur_daily)
  colnames(nok_eur_data) <- c("Date", "NOK_EUR")
  return(nok_eur_data)


nok_key_policy_rate_change <- function(days) 

  url_key_policy_rates <- "https://data.norges-bank.no/api/data/IR/B.KPRA.RR.R"

  key_policy_rates_obs <- read_xml(url_key_policy_rates) %>%
    xml_find_all("//Obs")

  key_policy_rates_subset <- key_policy_rates_obs[
    (length(key_policy_rates_obs) - days + 1):length(key_policy_rates_obs)
    ]

  dates_closed_rates <- key_policy_rates_subset %>%
    xml_attr("TIME_PERIOD") %>%
    as.Date("%Y-%m-%d")

  rates_daily <- key_policy_rates_subset %>%
    xml_attr("OBS_VALUE") %>%
    as.numeric()

  nok_key_policy_rate_data <- data.frame(x = dates_closed_rates, y = rates_daily)
  colnames(nok_key_policy_rate_data) <- c("Date", "Key_policy_rate")
  for(row in 1:nrow(nok_key_policy_rate_data)) 
    if(row == 1) 
      rate_change <- c(0)
     else 
      change_from_previous <- nok_key_policy_rate_data$Key_policy_rate[row] - nok_key_policy_rate_data$Key_policy_rate[row - 1]
      rate_change <- c(rate_change, change_from_previous)
    
  
  nok_key_policy_rate_data["Change"] <- rate_change

  nok_key_policy_rate_change_data <- filter(nok_key_policy_rate_data, Change != 0)
  return(nok_key_policy_rate_change_data)

 

nok_eur_plot <- function(nok_eur_data, regression_method) 
  g <- ggplot(
      nok_eur_data, 
      aes(x = Date, y = NOK_EUR)
      ) + 
    geom_smooth(method = regression_method) +
    geom_point() + 
    labs(
      x = "Date", 
      y = paste("NOK per EUR for the last", length(nok_eur_data$NOK_EUR), "working-days", sep = " "),
      title = "NOK per EUR",
      subtitle = paste("From", min(nok_eur_data$Date), "to", max(nok_eur_data$Date), sep = " ")
      ) + 
    theme(
      axis.title.y = element_text(color = "blue")
      )

  rate_changes <- nok_key_policy_rate_change(length(nok_eur_data$NOK_EUR))

  for(row in 1:nrow(rate_changes)) 
    g + geom_vline(xintercept = rate_changes$Date[row], colour = "red", size = 1, linetype = 4)
  

  plot(g)


for(no_days in analysis_periods) 

  nok_eur_plot(nok_eur(no_days), "auto")
  nok_eur_plot(nok_eur(no_days), "lm")


nok_eur_data 数据框(以 5 天为例):

    Date <date> NOK_EUR <dbl>
1   2019-09-25  9.9310      
2   2019-09-26  9.9235      
3   2019-09-27  9.9155      
4   2019-09-30  9.8953      
5   2019-10-01  9.9463      
6   2019-10-02  9.9930  
...

nok_key_policy_rate_change_data 数据帧(以 100 天为例):

    Date <date> Key_policy_rate <dbl> Change <dbl>
1   2019-06-21  0.25                  0.25  
2   2019-09-20  0.50                  0.25  

非常感谢任何建议。

【问题讨论】:

如果没有您的数据,我们所能做的就是猜测,但我猜有一个问题是,为了将 ggplot 命令放入函数中,您在 @ 中使用了 $ 987654335@,你shouldn't。相反,该函数需要使用tidyeval。 谢谢,@camille。去掉了 ggplot 语句的 aes 中的 $,并添加了所有数据。将看看tidyeval。请注意,即使进行了更改,geom_vline 仍然没有显示任何内容。 【参考方案1】:

您代码中的以下循环实际上不会修改图表:

for(row in 1:nrow(rate_changes)) 
    g + geom_vline(xintercept = rate_changes$Date[row], color = "red", size = 1, linetype = 4)

您应该分配结果(即g &lt;- g + ...)以获得效果。

更高效:去掉for循环,一次性添加所有垂直线

g <- g + geom_vline(xintercept = rate_changes$Date, color = "red", size = 1, linetype = 4)
print(g)

【讨论】:

没有什么能比得上好的代码审查了!完全错过了“g 最简单的错误有时最难发现! 当然。顺便说一句:如果有人想要固定代码,可以在这里找到:github.com/ElToro1966/EUR_NOK

以上是关于课程日期 x 轴上的 ggplot geom_vline的主要内容,如果未能解决你的问题,请参考以下文章

R:ggplot 在 x 轴上显示所有日期

ggplot2使用单独的日期和可变数据帧按日期绘制时间序列r

ggplot2:轴上的花括号?

用ggplot2绘制密度,x轴上没有线

ggplot2:在离散轴上显示每第 n 个值

从 ggplot2 转换时,Plotly 绘图未正确呈现