【问题标题】:Shade alternate quarters using ggplot2 and also alternate methods使用 ggplot2 和其他方法对备用季度进行着色
【发布时间】:2021-01-07 22:23:50
【问题描述】:

我想使用 ggplot2 或 R 中的任何其他方式为折线图创建垂直带。

    date <- seq.Date(from = as.Date("2015/01/01"), to = as.Date("2018/01/01"), by = 1)
    data <- runif(1097)
    
    df <- data.frame(cbind(date,data))
    df$date <- as.Date(df$date)
    
    datebreaks <- seq(as.Date("2015/01/01"), as.Date("2018/01/01"), by = "3 month")
    
    
    ggplot(df, aes(x = date, y = data)) + 
        geom_line() + ylim(-1,2) +
        scale_x_date(breaks = datebreaks)

给了这个

我需要一张带有阴影的交替季度图表。

【问题讨论】:

  • 声称的副本不一样,因为那个要求 ggplot2 而这个没有。

标签: r ggplot2


【解决方案1】:

据我所知,没有 ggplot 方法,但您可以很容易地生成条形图并使用 geom_rect

library(ggplot2)
library(dplyr)
library(lubridate)

df <- data.frame(
  date = seq.Date(from = as.Date("2015/01/01"), to = as.Date("2018/01/01"), by = 1),
  data = runif(1097)
)


datebreaks <- seq(as.Date("2015/01/01"), as.Date("2018/01/01"), by = "3 month")

# Generate bars
df_bars <- data.frame(
  xmin = seq(as.Date("2015/01/01"), as.Date("2017/07/01"), by = "6 months"),
  ymin = -Inf, ymax = Inf
) %>% 
  mutate(xmax = xmin + months(3))

ggplot(df) + 
  geom_rect(data = df_bars, aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax),
            fill = '#55555555') +
  geom_line(aes(x = date, y = data)) + 
  scale_x_date(breaks = datebreaks, expand = c(0,0),
               labels = function(x) paste0(year(x), ' Q', quarter(x))) + 
  ylim(c(-1,2))

编辑:我添加了一条格式化 x 轴的线

【讨论】:

  • 可选:使用ymin=-Inf, ymax=Inf,无需手动跟踪最小值/最大值。
  • 谢谢,请在解决方案中添加一行来格式化日期(勾选标签为 Q1 15)。我正在为此苦苦挣扎。
  • @Ashish 好的,我将其添加到答案中。在scale_*_*() 函数中,label= 参数可以是一个以breaks= 值为参数的函数。
【解决方案2】:

1) xblocks zoo 包具有xblocks 函数,允许以下紧凑公式:

library(zoo)

z <- read.zoo(df)
plot(z, xaxt = "n")
yq <- as.yearqtr(time(z))

# custom axis - optional - if omitted also omit xaxt arg in plot
yq.u <- unique(yq)
axis(1, as.Date(yq.u), yq.u)

xblocks(z, cycle(yq) %in% c(1, 3), col = adjustcolor("blue", 0.2))

2) panel.xblocks latticeExtra 包也有panel.xblocks,所以我们可以使用下面的点阵图形代码。如果需要默认比例,请省略 scales 参数。

library(latticeExtra)
library(zoo)

z <- read.zoo(df)
yq <- as.yearqtr(time(z))
yq.u <- unique(yq)

xyplot(z, scales = list(x = list(at = as.Date(yq.u), lab = yq.u))) + 
  layer(panel.lines(..., col = 1)) + 
  layer(panel.xblocks(z, cycle(yq) %in% c(1, 3), col = adjustcolor("blue", 0.2)))

【讨论】:

  • 有没有办法让标签也成为四分之一?
  • 已添加。
  • 完成了吗?我收到此错误Error in rect(xleft = blockStart, xright = blockEnd, ybottom = ybottom, : plot.new has not been called yet
  • 也许您的会话以某种方式搞砸了。退出然后启动一个新的 R 实例并将问题中的数据框定义df 复制并粘贴到 R 中,然后复制并粘贴答案中的代码。我只是这样做并得到答案中显示的情节。
  • 我认为问题在于我试图在降价文档中逐行执行它。它在普通的 R 脚本中运行良好,或者如果我在 Rmarkdown/notebook 中执行整个块。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-07
  • 2015-09-26
  • 1970-01-01
  • 1970-01-01
  • 2012-12-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多