gpt4 book ai didi

r - ggplot2:从x轴日期中删除周末和节假日的空白区域

转载 作者:行者123 更新时间:2023-12-04 04:04:37 27 4
gpt4 key购买 nike

在ggplot2中绘制股票数据并使用x轴(包含周末和节假日的缺口)时遇到问题。 this帖子非常有用,但是在尝试使用有序因素时遇到了许多问题。

library(xts)
library(grid)
library(dplyr)
library(scales)
library(bdscale)
library(ggplot2)
library(quantmod)

getSymbols("SPY", from = Sys.Date() - 1460, to = Sys.Date(), adjust = TRUE, auto.assign = TRUE)

input <- data.frame(SPY["2015/"])
names(input) <- c("Open", "High", "Low", "Close", "Volume", "Adjusted")

# i've tried changing rownames() to index(), and the plot looks good, but the x-axis is inaccurate
# i've also tried as.factor()
xaxis <- as.Date(rownames(input))
input$xaxis <- xaxis

p <- ggplot(input)
p <- p + geom_segment(aes(x = xaxis, xend = xaxis, y = Low, yend = High), size = 0.50) # body
p <- p + geom_segment(aes(x = xaxis - 0.4, xend = xaxis, y = Open, yend = Open), size = 0.90) # open
p <- p + geom_segment(aes(x = xaxis, xend = xaxis + 0.4, y = Close, yend = Close), size = 0.90) # close
p <- p + scale_y_continuous(scale_y_log10())
p + ggtitle("SPY: 2015")

enter image description here

上面的图(没有红色框)是使用上面的代码段生成的。下面的图表是尝试某些解决方案时的一些问题。首先,如果尝试使用数据框的索引,则将生成一个漂亮的图形,但x轴不准确;该数据当前在10月结束,但是在下面的图中该数据在7月结束:
enter image description here
xaxis <- as.Date(index(input))

其次,如果我尝试将行名强制为有序因子,则会丢失水平刻度数据(代表打开和关闭)。
enter image description here
xaxis <- factor(rownames(input), ordered = TRUE) 

如果我使用bdscale软件包,则会发生删除水平刻度线的相同问题,但网格线更干净:

enter image description here
p <- p + scale_x_bd(business.dates = xaxis)

最佳答案

下面的方法使用构面移除缺失日期之间的空格,然后移除构面之间的空白以恢复未构面图的外观。

首先,我们创建一个分组变量,该变量在日期中断时递增(从this SO answer改编的代码)。我们稍后将使用它来进行构面。

input$group = c(0, cumsum(diff(input$xaxis) > 1))

现在,将以下代码添加到您的绘图中。 facet_grid在由于周末或假日导致日期顺序中断的每个位置创建一个新构面。 scale_x_date每周添加一次主要刻度线,每天添加一次次网格线,但是您可以进行调整。 theme函数摆脱了切面标签和切面之间的垂直空间:
p + facet_grid(. ~ group, space="free_x", scales="free_x") +
scale_x_date(breaks=seq(as.Date("2015-01-01"),max(input$xaxis), "1 week"),
minor_breaks="1 day",
labels=date_format("%b %d, %Y")) +
theme(axis.text.x=element_text(angle=-90, hjust=0.5, vjust=0.5, size=11),
panel.margin = unit(-0.05, "lines"),
strip.text=element_text(size=0),
strip.background=element_rect(fill=NA)) +
ggtitle("SPY: 2015")

这是结果图。周末和节假日的空间不见了。每周都有重大休息。我将 scale_x_date breaks参数设置为从星期四开始的几周,因为没有一个假期是在星期四,因此每个方面在该日期上都有一个主要的刻度。 (相比之下,默认休息时间将在星期一。由于假期通常是在星期一,因此,星期一休息日的几周没有默认中断的主要记号。)但是,请注意,主要休息时间之间的间隔本质上是根据该周开放市场多少天而变化。

enter image description here

关于r - ggplot2:从x轴日期中删除周末和节假日的空白区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32893176/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com