R:ggplot2 - 根据主要 'month' x 日期轴缩放次要 'year quarter' x 日期轴
R: ggplot2 - Scaling a secondary 'year quarter' x date axis based on a primary 'month' x date axis
我想要两个 x 轴。其中一个(最好是主要的)有年季度,第二个有月份。我正在尝试这样做,因为我的日期观察结果不是 uniform/sequential。即我在第一季度只能有 1 月,但在第二季度可以有整整 3 个月。
我的尝试是使用 scale_x_date
,日期采用标准日期格式 (as.Date()
),并使用 date_labels
和 breaks
。
对于辅助轴,我使用了 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)
)
}
这是我尝试的情节图片:
我在这里面临的缺点:
- 正在绘制最后 3 个月的季度(即它将
匹配三月),我希望它匹配一月。
额外 - 其他低严重性问题是:
所有日期都标出来了,我猜是因为我在用
scale_x_date
我们应该使用 scale_x_discrete
..
如果我们只为存在的点写标签会很有帮助,否则我
观众可以 match/interpret 用他的眼睛点。
这是最低的严重性,但我想传递参数
运行 as.yearqtr
以便我可以格式化季度。即这将
yield as.yearqtr(Sys.Date()) %>% format("%y Q%q")
"20 Q2" 代替
的“2020 年第二季度”
我换个角度尝试,解决方法如下:
1- 对于主要问题,解决方案是使用 sec_axis
而不是 dup_axis
。
附加 - 其他低严重性解决方案是:
1- 为了仅绘制现有观察结果,我使用了 unique()
。这列在那个 SO 线程
2- 从函数 as.yearqtr
文档中,我可以看到 format
作为函数参数,但是传递参数不起作用,所以我使用了这个解决方法 labels = function(x) format(as.yearqtr(x),"%y Q%q")
。感谢@Axeman 提供 syntax/way.
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")
}
解图结果:
我想要两个 x 轴。其中一个(最好是主要的)有年季度,第二个有月份。我正在尝试这样做,因为我的日期观察结果不是 uniform/sequential。即我在第一季度只能有 1 月,但在第二季度可以有整整 3 个月。
我的尝试是使用 scale_x_date
,日期采用标准日期格式 (as.Date()
),并使用 date_labels
和 breaks
。
对于辅助轴,我使用了 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)
)
}
这是我尝试的情节图片:
我在这里面临的缺点:
- 正在绘制最后 3 个月的季度(即它将 匹配三月),我希望它匹配一月。
额外 - 其他低严重性问题是:
所有日期都标出来了,我猜是因为我在用
scale_x_date
我们应该使用scale_x_discrete
.. 如果我们只为存在的点写标签会很有帮助,否则我 观众可以 match/interpret 用他的眼睛点。这是最低的严重性,但我想传递参数 运行
as.yearqtr
以便我可以格式化季度。即这将 yieldas.yearqtr(Sys.Date()) %>% format("%y Q%q")
"20 Q2" 代替 的“2020 年第二季度”
我换个角度尝试,解决方法如下:
1- 对于主要问题,解决方案是使用 sec_axis
而不是 dup_axis
。
附加 - 其他低严重性解决方案是:
1- 为了仅绘制现有观察结果,我使用了 unique()
。这列在那个 SO 线程
2- 从函数 as.yearqtr
文档中,我可以看到 format
作为函数参数,但是传递参数不起作用,所以我使用了这个解决方法 labels = function(x) format(as.yearqtr(x),"%y Q%q")
。感谢@Axeman 提供 syntax/way.
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")
}
解图结果: