I would like to do candlestick plot with R and also add the donchian channel as indicator line. In the example below, the dataframe is not being extracted. not sure where i am making a error.
library(reprex)
library(quantmod)
#> Loading required package: xts
#> Loading required package: zoo
#>
#> Attaching package: 'zoo'
#> The following objects are masked from 'package:base':
#>
#> as.Date, as.Date.numeric
#> Loading required package: TTR
#> Registered S3 method overwritten by 'quantmod':
#> method from
#> as.zoo.data.frame zoo
library(PerformanceAnalytics)
#>
#> Attaching package: 'PerformanceAnalytics'
#> The following object is masked from 'package:graphics':
#>
#> legend
library(plotly)
#> Loading required package: ggplot2
#>
#> Attaching package: 'plotly'
#> The following object is masked from 'package:ggplot2':
#>
#> last_plot
#> The following object is masked from 'package:stats':
#>
#> filter
#> The following object is masked from 'package:graphics':
#>
#> layout
s <- get(getSymbols('CWK'))["2019::"]
#> 'getSymbols' currently uses auto.assign=TRUE by default, but will
#> use auto.assign=FALSE in 0.5-0. You will still be able to use
#> 'loadSymbols' to automatically load data. getOption("getSymbols.env")
#> and getOption("getSymbols.auto.assign") will still be checked for
#> alternate defaults.
#>
#> This message is shown once per session and may be disabled by setting
#> options("getSymbols.warning4.0"=FALSE). See ?getSymbols for details.
s$sma20 <- SMA(Cl(s) , 20)
head(s,3)
#> CWK.Open CWK.High CWK.Low CWK.Close CWK.Volume CWK.Adjusted sma20
#> 2019-01-02 14.29 14.75 13.82 14.53 911000 14.53 NA
#> 2019-01-03 14.51 14.70 13.97 14.19 627100 14.19 NA
#> 2019-01-04 14.25 14.35 13.60 14.25 697100 14.25 NA
s$dc <- DonchianChannel(s[,c("CWK.High","CWK.Low")],400,TRUE)
head(s,3)
#> CWK.Open CWK.High CWK.Low CWK.Close CWK.Volume CWK.Adjusted sma20
#> 2019-01-02 14.29 14.75 13.82 14.53 911000 14.53 NA
#> 2019-01-03 14.51 14.70 13.97 14.19 627100 14.19 NA
#> 2019-01-04 14.25 14.35 13.60 14.25 697100 14.25 NA
#> high mid dc
#> 2019-01-02 NA NA NA
#> 2019-01-03 NA NA NA
#> 2019-01-04 NA NA NA
fig <- s %>% plot_ly(x = ~Date, type="candlestick",
open = ~CWK.Open, close = ~CWK.Close,
high = ~CWK.High, low = ~CWK.Low)
#> Error: First argument, `data`, must be a data frame or shared data.
fig <- fig %>% layout(title = "Basic Candlestick Chart")
#> Error in layout(., title = "Basic Candlestick Chart"): object 'fig' not found
fig
#> Error in eval(expr, envir, enclos): object 'fig' not found
CodePudding user response:
plot_ly
want a data frame, but
> class(s)
[1] "xts" "zoo"
so it says Error: First argument, data, must be a data frame or shared data.
You need to convert class of s
, below is an example;
fig <- tibble::as_tibble(s, rownames = "Date") %>%
plot_ly(x = ~Date, type="candlestick",
open = ~CWK.Open, close = ~CWK.Close,
high = ~CWK.High, low = ~CWK.Low)
CodePudding user response:
You get the error because plot_ly()
expects the data to be a dataframe, and your data is not.
If you do class(s)
you'll see that the object that is returned from getSymbols()
has the classes xts
and zoo
, but not data.frame
.
You can make the plot work by by transforming s
to a dataframe before plotting. E.g. with dplyr::as_tibble(s, rownames = "Date")
. Under is a full example based on your code.
library(quantmod)
library(PerformanceAnalytics)
library(plotly)
s <- getSymbols('CWK', auto.assign = FALSE, from = "2019-01-01")
s$sma20 <- SMA(Cl(s) , 20)
s$dc <- DonchianChannel(s[ , c("CWK.High", "CWK.Low")], 400, TRUE)
s %>%
# Turn into a dataframe
dplyr::as_tibble(rownames = "Date") %>%
plot_ly(
x = ~Date,
type = "candlestick",
open = ~CWK.Open,
close = ~CWK.Close,
high = ~CWK.High,
low = ~CWK.Low
) %>%
layout(title = "Basic Candlestick Chart")