R:ggplot2-根据主要的“月” x日期轴缩放次要的“年季度” x日期轴

问题描述 投票:0回答:1

我想有两个x轴。其中一个(主要是首选)具有年份季度,第二个具有月份。我正在尝试执行此操作,因为我的日期观测值不是统一的/顺序的。即我在第一季度只能有1月,但是在第二季度可以有整个3个月。

[我的尝试是使用具有标准日期格式(scale_x_date)的日期的as.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)
               )
}

以下是我尝试的情节图像:enter image description here

我在这里面临的弊端:

  1. 该季度是最近3个月的绘图(即匹配三月),我希望它匹配一月。

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

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

  2. 这是最低的严重性,但我想传递参数功能as.yearqtr,所以我可以格式化四分之一。即这将产生as.yearqtr(Sys.Date()) %>% format("%y Q%q")改为“ 20 Q2”2020年第二季度”

r ggplot2 zoo
1个回答
0
投票

我已将尝试更改为另一个角度,解决方案如下:

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")
}

解决方案图结果:enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.