【问题标题】:Plotting discrete dates in boxplot x axis在箱线图 x 轴中绘制离散日期
【发布时间】:2018-02-13 22:02:45
【问题描述】:

我正在尝试使用 ggplot2 在财务数据上绘制蜡烛图。

我使用 rgdax 库来检索加密货币数据。

require(ggplot2)
require(rgdax)
require(quantmod)

candles <- public_candles(product_id = "ETH-EUR")
candles$candleLower <- pmin(candles$open, candles$close)
candles$candleMiddle <- NA
candles$candleUpper <- pmax(candles$open, candles$close)
candles$fill <- ''
candles$fill[candles$open < candles$close] = 'green'
candles$fill[candles$fill ==''] = 'red'

#Add Moving Averages
candles$ma200 <- SMA(candles$close, 200)
candles$ma50 <- SMA(candles$close, 50)

#Graphing Step
g <- ggplot(candles, aes(x=time, lower=candleLower, middle=candleMiddle, upper=candleUpper, ymin=low, ymax=high))
g <- g + geom_boxplot(stat='identity', aes(group=time, fill=fill))
g <- g + geom_line(aes(x=time, y=ma50))+ geom_line(aes(x=time, y=ma200))
g <- g + scale_x_datetime()
g

我遇到的问题是日期是连续的,我希望它们是离散的。因此错误消息:

提供给连续刻度的离散值

我还想保留完整的时间,包括小时、分钟和秒。

我尝试将 zoo 包中的 as.Date 与 scale_x_date 一起使用,但我遇到了同样的错误。

这是数据框的摘录:

> candles
                   time    low   high   open  close      volume
281 2018-02-13 16:40:00 684.55 684.55 684.55 684.55  0.14481784
280 2018-02-13 16:41:00 684.55 684.55 684.55 684.55  0.04325781
279 2018-02-13 16:43:00 683.99 684.55 684.55 683.99  0.60137169
278 2018-02-13 16:44:00 683.98 684.00 684.00 683.98  0.43150033
277 2018-02-13 16:46:00 682.72 683.90 683.90 682.72  1.73803500
276 2018-02-13 16:47:00 682.51 682.51 682.51 682.51  0.01398156
275 2018-02-13 16:49:00 682.51 682.51 682.51 682.51  0.28122771
274 2018-02-13 16:50:00 683.00 683.58 683.58 683.00  1.52767648
273 2018-02-13 16:51:00 682.99 683.00 682.99 683.00  0.29247699
272 2018-02-13 16:52:00 683.00 683.00 683.00 683.00  0.02190716
271 2018-02-13 16:54:00 683.00 683.58 683.00 683.58  0.50166543
270 2018-02-13 16:56:00 683.58 683.61 683.58 683.61 11.81034652
269 2018-02-13 16:58:00 683.98 683.99 683.99 683.98  0.44021340
268 2018-02-13 17:01:00 684.17 684.23 684.17 684.22  0.53595431
267 2018-02-13 17:02:00 684.37 684.37 684.37 684.37  0.48513463
266 2018-02-13 17:03:00 684.43 684.43 684.43 684.43  0.05492116
265 2018-02-13 17:05:00 684.43 684.43 684.43 684.43  0.11513667
264 2018-02-13 17:06:00 684.42 684.42 684.42 684.42  1.12376641
263 2018-02-13 17:07:00 684.43 684.43 684.43 684.43  0.57568335
262 2018-02-13 17:08:00 684.42 684.43 684.42 684.43  0.34713259
261 2018-02-13 17:09:00 684.42 684.42 684.42 684.42  9.89238437
260 2018-02-13 17:10:00 684.43 684.43 684.43 684.43  0.07287131
259 2018-02-13 17:11:00 684.43 684.48 684.43 684.48  1.19321749
258 2018-02-13 17:12:00 684.47 684.48 684.47 684.47  0.22166553
257 2018-02-13 17:13:00 684.21 684.47 684.47 684.21  0.06647252

这是预期的输出:

【问题讨论】:

  • 您的错误从 ggplot 部分的开头开始。我猜它更关心candles$candleMiddle &lt;- NA 行而不是时间变量,因为'candleMiddle' 当你绘制str(candles) 时,它是[lower, middle, upper] 的唯一逻辑。在我对这条线做了一些事情之后(这绝对不是正确的事情),ggplot 产生了一些东西,这证明了这个理论。

标签: r ggplot2


【解决方案1】:

对代码做了一些改动:geom_boxplot要求中间值不能是NA,所以我把它设置为开闭的平均值,但可以设置为任何其他值而不是NA .然后,我还将日期转换为POSIXct 以供scale_x_datetime 使用,并添加了一些格式以便更好地显示标签。

有了这些变化,我认为它现在可以工作了,我希望它会起作用。

require(ggplot2)
require(rgdax)
require(quantmod)

candles <- public_candles(product_id = "ETH-EUR")[c(1:250),] # Selected 250 to be able to see the candles
candles$candleLower <- pmin(candles$open, candles$close)
candles$candleMiddle <- NA
candles$candleUpper <- pmax(candles$open, candles$close)

# CandleMiddle has to be set to a value so candles can be plot.
# candles$candleMiddle <- NA raises: `Error: Discrete value supplied to continuous scale``
candles$candleMiddle <- 0.5*(candles$open+candles$close)
candles$fill <- ''
candles$fill[candles$open < candles$close] = 'green'
candles$fill[candles$fill ==''] = 'red'

candles$time <- as.POSIXct(candles$time)
#Add Moving Averages
candles$ma200 <- SMA(candles$close, 200)
candles$ma50 <- SMA(candles$close, 50)

#Graphing Step
g <- ggplot(candles, aes(x = time)) + 
     geom_boxplot(stat='identity', aes(group=time,
                                                   fill=fill, 
                                                   lower=candleLower,
                                                   middle=candleMiddle, 
                                                   upper=candleUpper, 
                                                   ymin=low, 
                                                   ymax=high))+
    geom_line(aes(y=ma50, linetype='ma50'))+ 
    geom_line(aes(y=ma200,linetype='ma200'))+
    ylab("ETH-EUR") 

g <- g + scale_x_datetime("", date_breaks = "15 min", date_labels = "%H:%M",
                      date_minor_breaks = "1 day")

g <- g + guides(linetype=guide_legend(title=''), fill=FALSE) # Remove 'fill' legend and just leave the one for the MA

g

【讨论】:

    猜你喜欢
    • 2020-12-02
    • 1970-01-01
    • 2016-05-14
    • 1970-01-01
    • 2019-09-03
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    • 2016-11-10
    相关资源
    最近更新 更多