【问题标题】:R: ggplot2 - Scaling a secondary 'year quarter' x date axis based on a primary 'month' x date axisR:ggplot2 - 根据主要“月份”x 日期轴缩放次要“年季度”x 日期轴
【发布时间】:2020-05-28 21:15:41
【问题描述】:

我想要两个 x 轴。其中一个(最好是主要的)有年份季度,第二个有月份。我正在尝试这样做,因为我的日期观察不是统一/连续的。即我可以在第一季度只有一月,但在第二季度整个 3 个月。

我的尝试是使用具有标准日期格式 (as.Date()) 的日期的scale_x_date,并使用date_labelsbreaks。 对于辅助轴,我使用了dup_axis 并通过了zoo::as.yearqtr

library("zoo")
library("ggplot2")
set.seed(44)

## Creating a reproducible data-frame ##

df <- data.frame("id" = sample(1:100, 3, replace=TRUE),
                 "date" = c("2020-01-01","2020-02-01","2020-03-01",
                            "2020-04-01",
                            "2020-07-01","2020-09-01",
                            "2020-10-01","2020-11-01","2020-12-01")
                 )
## Plotting ##
df %>% 
{
ggplot(data = ., aes(x = as.Date(date), y = id, group = 1)) +
  geom_line() +
  geom_point() +
  scale_x_date(date_labels = "%b", breaks = "1 month",
               sec.axis = dup_axis(name = "month", breaks = scales::date_breaks("3 month"),  labels = as.yearqtr)
               )
}

这是我尝试的情节图像:

我在这里面临的缺点:

  1. 正在绘制最后 3 个月的季度(即它将 匹配三月),我希望它改为匹配一月。

额外 - 其他低严重性问题是:

  1. 绘制了所有日期,我想这是因为我正在使用 scale_x_date 我们应该使用 scale_x_discrete .. 它会是 如果我们只为存在的点写标签会很有帮助,否则我会 观众可以用眼睛匹配/解释这些点。

  2. 这是最低严重性,但我想传递参数 运行as.yearqtr,这样我就可以格式化季度。即这将 yield as.yearqtr(Sys.Date()) %&gt;% format("%y Q%q") "20 Q2" 代替 “2020 年第二季度”

【问题讨论】:

  • 关于你的第一个低严重性问题,不,你不应该使用scale_x_discrete,因为那样月之间的间隔将不再相同。如有必要,您可以将 breaks 调整为仅要标记的月份。
  • 关于你的第二期,你可以写例如labels = function(x) as.yearqtr(x, your, other, args)labels = . %&gt;% as.yearqrt(your, other, args).
  • 感谢您的建议,对于第二个低优先级问题,我相信他们通过了参数yes ..但他们不适用于as.yearqrt,因为它不接受它。所以我从外面格式化了它:例如labels = function(x) format(as.yearqtr(x),"%y Q%q")

标签: r ggplot2 zoo


【解决方案1】:

我已经改变了我的尝试到另一个角度,解决方案如下:

1- 对于主要问题,解决方案是使用sec_axis 而不是dup_axis

附加 - 其他低严重性解决方案是:

1- 为了仅绘制现有观察结果,我使用了unique()。这列在那个 SO 线程 link

2- 从函数as.yearqtr 文档中,我可以看到format 作为函数参数,但是传递参数不起作用,所以我使用了这个解决方法labels = function(x) format(as.yearqtr(x),"%y Q%q")。感谢@Axeman 提供语法/方式。

df %>% 
{
ggplot(data = ., aes(x = as.Date(date), y = id, group = 1)) +
  geom_line() +
  geom_point() +
  scale_x_date(breaks = unique(as.Date(.$date)), date_labels = "%b",
               sec.axis = sec_axis(name = "quarter", trans = ~ ., labels = function(x) format(as.yearqtr(x),"%y Q%q"))
  ) +
  xlab("month")
}

解图结果:

【讨论】:

    猜你喜欢
    • 2021-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 2021-03-05
    相关资源
    最近更新 更多