在ggplot中使用条形图时出现意外的x轴刻度线

时间:2019-01-29 12:33:24

标签: r ggplot2

我正在尝试在ggplot中创建一个条形图,以显示特定日期在两个不同位置的利润。

这是我正在使用的代码:

test_data <- data.frame("location" = c('location_1', 'location_2',
                                   'location_1', 'location_2',
                                   'location_1', 'location_2',
                                   'location_1', 'location_2',
                                   'location_1', 'location_2',
                                   'location_1', 'location_2',
                                   'location_1', 'location_2',
                                   'location_1', 'location_2',
                                   'location_1', 'location_2'), 
                      "date" = c(as.Date('2018-07-29'), as.Date('2018-07-29'), 
                               as.Date('2018-07-30'), as.Date('2018-07-30'), 
                               as.Date('2018-08-02'), as.Date('2018-08-02'), 
                               as.Date('2018-08-03'), as.Date('2018-08-03'), 
                               as.Date('2018-08-05'), as.Date('2018-08-05'),
                               as.Date('2018-08-08'), as.Date('2018-08-08'),
                               as.Date('2018-08-12'), as.Date('2018-08-12'), 
                               as.Date('2018-08-15'), as.Date('2018-08-15'), 
                               as.Date('2018-08-19'), as.Date('2018-08-19')),
                    "profit" = c(540, 120, 265, 493, 245, 432, 987, 566,
                                 654, 765, 234, 767, 650, 765, 874, 652,
                                 175, 497), 
                    stringsAsFactors = FALSE) 

sundays <- c(as.Date('2018-07-29'),as.Date('2018-08-05'),
             as.Date('2018-08-12'),as.Date('2018-08-19'))

test_data %>% 
filter(date %in% sundays) %>% 
ggplot(aes(x=date, y=profit)) + 
geom_bar(stat = 'identity') +
xlab('Date') +
ylab('Profit') + 
facet_wrap(~location)

因此,我想创建一个只显示星期日的图形,但绘制时将错误的日期与条形关联起来。

graph example

该如何解决?预先感谢!

1 个答案:

答案 0 :(得分:1)

检查此解决方案:

test_data %>%
  filter(date %in% sundays) %>%
  mutate(date = date %>% as.character()) %>%
  ggplot(aes(x=date, y=profit)) + 
  geom_bar(stat = 'identity') +
  xlab('Date') +
  ylab('Profit') + 
  facet_wrap(~location) +
  scale_x_discrete(
    labels = function(x) x %>% as.Date() %>% format('%b %d')
  )

在评论中提问的问题

我发现了一些“肮脏的骇客”,但是我不确定它是否在所有情况下都有效。检查并让我知道。

library(tidyverse)
library(wrapr)

test_data %>%
  filter(date %in% sundays) %>%
  arrange(date) %>%
  group_by(location) %>%
  mutate(
    xpos = row_number(),
    xlab = if_else(xpos %% 2 == 0, '', date %>% as.Date() %>% format('%b %d'))
  ) %.>%
  ggplot(
    data = .,
    aes(x = factor(xpos), y = profit)
  ) + 
  geom_bar(stat = 'identity') +
  xlab('Date') +
  ylab('Profit') + 
  facet_wrap(~location) +
  scale_x_discrete(
    breaks = .$xpos,
    labels = .$xlab 
  )