#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")