在 ggplot 中移动 'group' 的所有数据点
Moving all data points of a 'group' in ggplot
我什至很难阐明这个问题 -
我想如果我只是展示我的 objective 会更容易:
举个例子:
require(tidyverse)
df <- data.frame(planet = rep(c("mars", "jupiter"), each = 10),
date = seq(as.Date("2020-01-01"), as.Date("2020-01-10"), length.out = 10) %>% rep(2),
someNumbers = c(1:10, 6:15)
)
df
planet date someNumbers
1 mars 2020-01-01 1
2 mars 2020-01-02 2
3 mars 2020-01-03 3
4 mars 2020-01-04 4
5 mars 2020-01-05 5
6 mars 2020-01-06 6
7 mars 2020-01-07 7
8 mars 2020-01-08 8
9 mars 2020-01-09 9
10 mars 2020-01-10 10
11 jupiter 2020-01-01 6
12 jupiter 2020-01-02 7
13 jupiter 2020-01-03 8
14 jupiter 2020-01-04 9
15 jupiter 2020-01-05 10
16 jupiter 2020-01-06 11
17 jupiter 2020-01-07 12
18 jupiter 2020-01-08 13
19 jupiter 2020-01-09 14
20 jupiter 2020-01-10 15
如果我作图
ggplot(df, aes(date, someNumbers, group = planet)) + geom_bar(stat = "identity", position = "dodge", aes(fill = planet))
我可以看到这两颗行星在 someNumbers
中遵循相同的顺序。
我想要做的是将所有 mars
蓝色条向左移动 4-5 天,以便我可以轻松地直观地比较序列。
我可以通过以下方式做到这一点:
df.mars <- subset(df, planet == "mars")
df.jupiter <- subset(df, planet == "jupiter")
df.mars$date <- df.mars$date - 5 #subset mars and manually minus 5
bind_rows(df.mars, df.jupiter) %>% ggplot(aes(date, someNumbers, group = planet)) + geom_bar(stat = "identity", position = "dodge", aes(fill = planet))
但是,我实际上是在将 date
的基础值更改为 mars
。
我能否在不实际更改基础 date
值的情况下实现相同的效果,而只是将所有 mars
geom_bar()
向左或向右移动任意数量?
理想情况下,我会有两个 x 轴标签:一个用于 mars
一个用于 jupiter
.
Rant:这个问题是我在玩 covid19 数据集时出现的。
我正在绘制按国家/地区分组的条形图:
Y-axis = #cases
X-axis = Date
我想将所有 USA
条向左移动 n Days
以便我可以按照 "USA trend is following that of Italy with n Days
behind"
的方式发表声明
您可以使用辅助轴。
bind_rows(df.mars, df.jupiter) %>%
ggplot(aes(date, someNumbers, fill = planet)) +
geom_col(position = 'dodge') +
scale_x_date('Mars date', sec.axis = sec_axis(~. - 5, 'Jupiter date'))
使用 ggtext
的更漂亮的版本:
library(ggtext)
bind_rows(df.mars, df.jupiter) %>%
ggplot(aes(date, someNumbers, fill = planet)) +
geom_col(position = position_dodge(preserve = 'single'), show.legend = FALSE) +
scale_x_date(
name = "<i style='color:firebrick'>Mars date</i>",
sec.axis = sec_axis(~. - 5, "<i style='color:navy'>Jupiter date</i>")
) +
scale_fill_manual(values = c(jupiter = 'navy', mars = 'firebrick')) +
theme_minimal() +
theme(axis.title.x = element_markdown(), axis.title.x.top = element_markdown())
我什至很难阐明这个问题 -
我想如果我只是展示我的 objective 会更容易: 举个例子:
require(tidyverse)
df <- data.frame(planet = rep(c("mars", "jupiter"), each = 10),
date = seq(as.Date("2020-01-01"), as.Date("2020-01-10"), length.out = 10) %>% rep(2),
someNumbers = c(1:10, 6:15)
)
df
planet date someNumbers
1 mars 2020-01-01 1
2 mars 2020-01-02 2
3 mars 2020-01-03 3
4 mars 2020-01-04 4
5 mars 2020-01-05 5
6 mars 2020-01-06 6
7 mars 2020-01-07 7
8 mars 2020-01-08 8
9 mars 2020-01-09 9
10 mars 2020-01-10 10
11 jupiter 2020-01-01 6
12 jupiter 2020-01-02 7
13 jupiter 2020-01-03 8
14 jupiter 2020-01-04 9
15 jupiter 2020-01-05 10
16 jupiter 2020-01-06 11
17 jupiter 2020-01-07 12
18 jupiter 2020-01-08 13
19 jupiter 2020-01-09 14
20 jupiter 2020-01-10 15
如果我作图
ggplot(df, aes(date, someNumbers, group = planet)) + geom_bar(stat = "identity", position = "dodge", aes(fill = planet))
我可以看到这两颗行星在 someNumbers
中遵循相同的顺序。
我想要做的是将所有 mars
蓝色条向左移动 4-5 天,以便我可以轻松地直观地比较序列。
我可以通过以下方式做到这一点:
df.mars <- subset(df, planet == "mars")
df.jupiter <- subset(df, planet == "jupiter")
df.mars$date <- df.mars$date - 5 #subset mars and manually minus 5
bind_rows(df.mars, df.jupiter) %>% ggplot(aes(date, someNumbers, group = planet)) + geom_bar(stat = "identity", position = "dodge", aes(fill = planet))
但是,我实际上是在将 date
的基础值更改为 mars
。
我能否在不实际更改基础 date
值的情况下实现相同的效果,而只是将所有 mars
geom_bar()
向左或向右移动任意数量?
理想情况下,我会有两个 x 轴标签:一个用于 mars
一个用于 jupiter
.
Rant:这个问题是我在玩 covid19 数据集时出现的。 我正在绘制按国家/地区分组的条形图:
Y-axis = #cases
X-axis = Date
我想将所有 USA
条向左移动 n Days
以便我可以按照 "USA trend is following that of Italy with n Days
behind"
您可以使用辅助轴。
bind_rows(df.mars, df.jupiter) %>%
ggplot(aes(date, someNumbers, fill = planet)) +
geom_col(position = 'dodge') +
scale_x_date('Mars date', sec.axis = sec_axis(~. - 5, 'Jupiter date'))
使用 ggtext
的更漂亮的版本:
library(ggtext)
bind_rows(df.mars, df.jupiter) %>%
ggplot(aes(date, someNumbers, fill = planet)) +
geom_col(position = position_dodge(preserve = 'single'), show.legend = FALSE) +
scale_x_date(
name = "<i style='color:firebrick'>Mars date</i>",
sec.axis = sec_axis(~. - 5, "<i style='color:navy'>Jupiter date</i>")
) +
scale_fill_manual(values = c(jupiter = 'navy', mars = 'firebrick')) +
theme_minimal() +
theme(axis.title.x = element_markdown(), axis.title.x.top = element_markdown())