фактор, не учитывающий метки оси X для графика - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть датафрейм, импортированный из Excel. один из столбцов имеет формат:

dates
-------
Oct-17
Nov-17
Dec-17
Jan-18
Feb-18
Mar-18
Apr-18
May-18
Jun-18
Jul-18
Aug-18

Все остальные столбцы - просто цифры

Когда я строю график с использованием графика (линейная диаграмма), я получаю свою ось x в алфавитном порядке. Я попробовал фактор. Но это не работает.

 data_ = read_excel(path="Sample.xlsx",sheet = 'sheet1')
  data = as.data.frame(data_)
 data$dates <- factor(data$dates, levels = data$dates)

Что должно быть сделано? Наконец, мне нужна ось х, помеченная месяцами в этом формате Oct-18,Nov-18

код участка:

pred <- plot_ly(data_, x = ~dates, y = ~exp, name = 'Exp', type = 'scatter', mode = 'lines',
               line = list(color = 'rgb(205, 12, 24)', width = 4)) %>%
    add_trace(y = ~acc, name = 'Accumulated', line = list(color = 'rgb(22, 96, 167)', width = 4)) %>%
    add_trace(y = ~sts, name = 'Contract', line = list(color = 'rgb(205, 12, 24)', width = 4, dash = 'dash')) %>%
    add_trace(y = ~stat, name = 'Status ', line = list(color = 'rgb(22, 96, 167)', width = 4, dash = 'dash')) %>%
    layout(title = "Trend",
           xaxis = list(title = "Months"),
           yaxis = list (title = "")"))

1 Ответ

0 голосов
/ 06 ноября 2018

Если вы передадите аргумент ordered = TRUE внутри функции factor(), порядок ваших уровней будет соответствовать порядку, в котором они появляются при печати data$dates. Это также порядок их появления в сюжете. Поведение по умолчанию, если вы не установите ordered = TRUE, состоит в расположении коэффициентов символов в алфавитном порядке.

EDIT

Чтобы программно получить столбец dates в правильном порядке, вы можете попробовать следующий код (это зависит от пакетов dplyr и stringr):

levels <- data %>%
  distinct(dates) %>% 
  rowwise() %>% 
  mutate(
    year = stringr::str_split(dates, "-", simplify = TRUE)[2],
    month = stringr::str_split(dates, "-", simplify = TRUE)[1], 
    month = match(month, month.abb)
    ) %>% 
  arrange(year, month) %>% 
  pull(dates)

Теперь вы просто передаете этот levels вектор аргументу levels внутри factor()

...