Как я могу изменить этот код ggplot, чтобы он работал с моими импортированными данными Excel?

#r #ggplot2

#r #ggplot2

Вопрос:

Я использую этот код и пытаюсь реализовать свой набор данных AAPL, который я уже импортировал в R из Excel:

 library(ggplot2)
library(quantmod)
draw_candles <- function(df, title_param, alpha_param = 1){
     df$change <- ifelse(df$Close > df$Open, "up", ifelse(df$Close < df$Open, "down", "flat"))
     
     # originally the width of the bars was calculated by FXQuantTrader with use of periodicity()', which 
     # seems to work ok only with: ‘minute’,‘hourly’, ‘daily’,‘weekly’, ‘monthly’,
     # ‘quarterly’, and ‘yearly’, but can not do 1 sec bars while we want arbitrary bar size support!-)
     # df$width <- as.numeric(periodicity(df)[1])
     # So let us instead find delta (seconds) between 1st and 2nd row and just 
     # use it for all other rows. We check 1st 3 rows to avoid larger "weekend gaps"
     width_candidates <- c(as.numeric(difftime(df$Date[2], df$Date[1]), units = "secs"),
                           as.numeric(difftime(df$Date[3], df$Date[2]), units = "secs"),
                           as.numeric(difftime(df$Date[4], df$Date[3]), units = "secs"))

     df$width_s = min(width_candidates)  # one (same) candle width (in seconds) for all the bars
     
     # define the vector of candle colours either by name or by rgb()
     #candle_colors = c("down" = "red", "up" = "green", "flat" = "blue")
     candle_colors = c("down" = rgb(192,0,0,alpha=255,maxColorValue=255), "up" = rgb(0,192,0,alpha=255,maxColorValue=255), "flat" = rgb(0,0,192,alpha=255,maxColorValue=255))
     
     # Candle chart:
     g <- ggplot(df, aes(x=Date)) 
         geom_linerange(aes(ymin=Low, ymax=High, colour = change), alpha = alpha_param)    # candle whiskerss (vertical thin lines:)
         theme_bw()  
         labs(title=title_param)  
         geom_rect(aes(xmin = Date - width_s/2 * 0.9, xmax = Date   width_s/2 * 0.9, ymin = pmin(Open, Close), ymax = pmax(Open, Close), fill = change), alpha = alpha_param)                              
            # cabdke body
         guides(fill = FALSE, colour = FALSE)  
         scale_color_manual(values = candle_colors)    # color for line
         scale_fill_manual(values = candle_colors)     # color for candle fill  
     
     # Handle special cases: flat bar and Open == close:
     if (any(df$change == "flat")) g <- g   geom_segment(data = df[df$change == "flat",], aes(x = Date - width_s / 2 * 0.9, y = Close, yend = Close, xend = Date   width_s / 2 * 0.9, colour = change), alpha = alpha_param)
     
     g
}
 > print(draw_candles(g,AAPL))
  

Моя проблема в том, что каждый раз, когда я пытаюсь распечатать график, я получаю эту ошибку:

Ошибка в ifelse(df $ Close> df $ Open, «вверх», ifelse(df $ Close <df $ Open, «вниз», : объект ‘g’ не найден

И я понятия не имею, как это исправить или что я делаю неправильно.

 dput(head(AAPL, 20))
structure(list(Date = structure(c(345427200, 345686400, 345772800, 
345859200, 345945600, 346032000, 346291200, 346377600, 346464000, 
346636800, 346896000, 346982400, 347068800, 347241600, 347500800, 
347587200, 347673600, 347760000, 347846400, 348105600), tzone = "UTC", class 
= c("POSIXct", 
"POSIXt")), Open = c("0.12834799999999999", "0.12221", "0.11328100000000001", 
"0.115513", "0.118862", "0.12611600000000001", "0.13225400000000001", 
"0.13783500000000001", "0.145089", "0.15848200000000001", "0.160714", 
"0.15736600000000001", "0.15290200000000001", "0.15401799999999999", 
"0.151228", "0.14453099999999999", "0.13839299999999999", "0.135603", 
"0.14229900000000001", "0.14229900000000001"), High = 
c("0.12890599999999999", 
"0.12221", "0.11328100000000001", "0.11607099999999999", "0.11942", 
"0.12667400000000001", "0.13281299999999999", "0.13839299999999999", 
"0.145647", "0.15903999999999999", "0.161272", "0.15736600000000001", 
"0.15290200000000001", "0.15513399999999999", "0.151228", 
"0.14453099999999999", 
"0.13839299999999999", "0.135603", "0.14285700000000001", 
"0.14229900000000001"
), Low = c("0.12834799999999999", "0.121652", "0.112723", "0.115513", 
"0.118862", "0.12611600000000001", "0.13225400000000001", 
"0.13783500000000001", 
"0.145089", "0.15848200000000001", "0.160714", "0.156808", 
"0.15234400000000001", 
"0.15401799999999999", "0.15067", "0.14397299999999999", 
"0.13783500000000001", 
"0.135045", "0.14229900000000001", "0.141183"), Close = 
c("0.12834799999999999", 
"0.121652", "0.112723", "0.115513", "0.118862", "0.12611600000000001", 
"0.13225400000000001", "0.13783500000000001", "0.145089", 
"0.15848200000000001", 
"0.160714", "0.156808", "0.15234400000000001", "0.15401799999999999", 
"0.15067", "0.14397299999999999", "0.13783500000000001", "0.135045", 
"0.14229900000000001", "0.141183"), `Adj Close` = c("0.101261", 
"0.095977999999999994", "0.088933999999999999", "0.091134999999999994", 
"0.093776999999999999", "0.099500000000000005", "0.10434300000000001", 
"0.108746", "0.114469", "0.12503500000000001", "0.12679599999999999", 
"0.12371500000000001", "0.12019299999999999", "0.121513", 
"0.11887200000000001", 
"0.11358799999999999", "0.108746", "0.106544", "0.11226800000000001", 
"0.111387"), Volume = c("469033600", "175884800", "105728000", 
"86441600", "73449600", "48630400", "37363200", "46950400", "48003200", 
"55574400", "93161600", "68880000", "35750400", "21660800", "35728000", 
"45158400", "55686400", "39827200", "21504000", "23699200")), row.names = 
c(NA, 
-20L), class = c("tbl_df", "tbl", "data.frame"))
  

Комментарии:

1. Попробуйте draw_candles(AAPL, "TITLE") . Функции принимают фрейм данных в качестве первого аргумента, заголовок для графика и альфа-параметр по умолчанию.

2. @stefan, это, к сожалению, не сработало. В нем говорится, что ‘g’ и ‘AAPL’ не найдены. Может ли это быть проблемой с моими данными?

3. Привет, Дрейк-Пайта. Хм. Трудно сказать, связано ли это с вашими данными или с кодом. Поэтому: не могли бы вы предоставить фрагмент ваших данных? Лучший способ сделать это — ввести dput(head(AAPL, 20)) (который выдает первые 20 строк ваших данных) в консоль. Затем скопируйте и вставьте выходные данные, начинающиеся с structure(... , в свой пост.

4. Я превратил его в data.frame, а также добавил столбец даты, и, похоже, он все еще не работает. Я отредактирую свой пост, чтобы показать dput(head(AAPL, 20))

5. о, хорошо, позвольте мне попробовать это

Ответ №1:

Не уверен, что не так. Итак, теперь полный reprex.

 library(ggplot2)
library(quantmod)

draw_candles <- function(df, title_param, alpha_param = 1) {
  df$change <- ifelse(df$Close > df$Open, "up", ifelse(df$Close < df$Open, "down", "flat"))

  # originally the width of the bars was calculated by FXQuantTrader with use of periodicity()', which
  # seems to work ok only with: 'minute','hourly', 'daily','weekly', 'monthly',
  # 'quarterly', and 'yearly', but can not do 1 sec bars while we want arbitrary bar size support!-)
  # df$width <- as.numeric(periodicity(df)[1])
  # So let us instead find delta (seconds) between 1st and 2nd row and just
  # use it for all other rows. We check 1st 3 rows to avoid larger "weekend gaps"
  width_candidates <- c(
    as.numeric(difftime(df$Date[2], df$Date[1]), units = "secs"),
    as.numeric(difftime(df$Date[3], df$Date[2]), units = "secs"),
    as.numeric(difftime(df$Date[4], df$Date[3]), units = "secs")
  )

  df$width_s <- min(width_candidates) # one (same) candle width (in seconds) for all the bars

  # define the vector of candle colours either by name or by rgb()
  # candle_colors = c("down" = "red", "up" = "green", "flat" = "blue")
  candle_colors <- c("down" = rgb(192, 0, 0, alpha = 255, maxColorValue = 255), "up" = rgb(0, 192, 0, alpha = 255, maxColorValue = 255), "flat" = rgb(0, 0, 192, alpha = 255, maxColorValue = 255))

  # Candle chart:
  g <- ggplot(df, aes(x = Date))  
    geom_linerange(aes(ymin = Low, ymax = High, colour = change), alpha = alpha_param)   # candle whiskerss (vertical thin lines:)
    theme_bw()  
    labs(title = title_param)  
    geom_rect(aes(xmin = Date - width_s / 2 * 0.9, xmax = Date   width_s / 2 * 0.9, ymin = pmin(Open, Close), ymax = pmax(Open, Close), fill = change), alpha = alpha_param)  
    # cabdke body
    guides(fill = FALSE, colour = FALSE)  
    scale_color_manual(values = candle_colors)   # color for line
    scale_fill_manual(values = candle_colors) # color for candle fill

  # Handle special cases: flat bar and Open == close:
  if (any(df$change == "flat")) g <- g   geom_segment(data = df[df$change == "flat", ], aes(x = Date - width_s / 2 * 0.9, y = Close, yend = Close, xend = Date   width_s / 2 * 0.9, colour = change), alpha = alpha_param)

  g
}

draw_candles(AAPL, "Hello")