Перемещение всех точек данных «группы» в ggplot - PullRequest
3 голосов
/ 21 марта 2020

Мне трудно даже сформулировать вопрос -

Думаю, будет проще, если я просто покажу свою цель: Возьмите этот пример:

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

enter image description here


Я могу видеть, что две планеты следуют одинаковой последовательности в 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))

enter image description here

Однако я на самом деле изменяю базовые значения date для mars.

Могу ли я добиться того же самого, фактически не меняя базовые значения date и просто сдвинув все mars geom_bar() влево или вправо на произвольную величину? В идеале у меня было бы две метки по оси X: одна для mars, одна для jupiter.

Rant: Этот вопрос возник, когда я играл с набором данных covid19. Я строил гистограммы, сгруппированные по странам с:

Y-axis = #cases
X-axis = Date

Я хотел переместить все свои USA бары влево на n Days, чтобы я мог сделать заявление в соответствии с трендом США следует за Италией с n Days позади "

1 Ответ

5 голосов
/ 21 марта 2020

Вы можете использовать вспомогательную ось.

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'))

enter image description here

Более симпатичная версия с использованием 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())

enter image description here

...