Ggplot Дата коррекция по оси X - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть набор данных, который выглядит следующим образом:

                   pollster    enddate rawpoll_clinton rawpoll_trump
4208               EPIC-MRA  1/26/2016            51.2          48.8
4168               EPIC-MRA  3/22/2016            56.0          44.0
4162               EPIC-MRA   8/4/2016            57.3          42.7
1187               EPIC-MRA  9/13/2016            52.1          47.9
747                EPIC-MRA  10/3/2016            57.3          42.7
368                EPIC-MRA 10/24/2016            54.7          45.3
124                EPIC-MRA  11/3/2016            52.5          47.5
3132 Glengariff Group, Inc.  5/26/2016            52.9          47.1
2282 Glengariff Group, Inc.   8/1/2016            56.5          43.5
789  Glengariff Group, Inc.  9/28/2016            54.5          45.5
436  Glengariff Group, Inc. 10/11/2016            58.0          42.0

Я пытаюсь создать график с отдельной строкой для каждого опроса, чтобы показать, как утверждение меняется со временем.

код, который я использовал, чтобы сделать это для "клинтона", приведен ниже:

ggplot(data = mich_polls, aes(x = enddate, y = rawpoll_clinton, group=2)) + 
  geom_line(aes(colour = pollster, size = 1.5))+
  theme(axis.text.x = element_text(angle = 40, hjust = 1))

Тем не менее, это приводит только к графику с испорченной осью даты, которая не в хронологическом порядке:

enter image description here

Чтобы решить эту проблему, я попытался преобразовать переменную enddate в формат даты, но в итоге получил странные результаты.В большинстве попыток создается список значений NA.Следующие два произвели что-то странное:

as.Date(data.frame(as.factor(mich_polls$enddate), stringsAsFactors = FALSE)[[1]], 
                   format = "%d/%m/%Y")

, что дает:

 [1] NA           NA           "2016-04-08" NA           "2016-03-10" NA           "2016-03-11"
 [8] NA           "2016-01-08" NA           "2016-11-10"

Я также пробовал:

as.Date(data.frame(as.factor(mich_polls$enddate),
                   stringsAsFactors = FALSE)[[1]], format = "%d/%m/%Y")

, что дает:

[1] "2016-01-26" "2016-03-22" NA           "2016-09-13" NA           "2016-10-24" NA          
 [8] "2016-05-26" NA           "2016-09-28" "2016-10-11"

Может кто-нибудь подсказать, как исправить формат данных ИЛИ предложить другой способ сделать мои линейные графики?

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Я сталкивался с подобной проблемой при обработке дат.Это долгий метод, но он прост и работает.Попробуйте это:

1.Загрузить дату в фрейм данных

 df = data.frame(Date = (file$enddate)

2.Создать новую переменную и использовать коэффициент для даты

new_var <- factor(df$Date)

3.Используйте character.Date

new_var <- as.character.Date(new_var)

4. И, наконец, используйте as.Date

new_var <- as.Date(new_var,"%d/%m/%Y) #In your case use month date and year

5.Добавьте это к вашему исходному dataframe и постройте как обычно

0 голосов
/ 18 декабря 2018

Вы можете напрямую применить as.Date(), например, так:

mich_polls$enddate <- as.Date(mich_polls$enddate, format="%m/%d/%y")

В графике используйте scale_x_date() и параметр date_breaks, где вы можете применять значения, такие как "2 weeks", "1 month" и подобныевещей;просто посмотрите в ?scale_x_date, после загрузки library(ggplot2) конечно.

library(ggplot2)
ggplot(data = mich_polls, aes(x = enddate, y = rawpoll_clinton, group=2)) + 
  geom_line(aes(colour = pollster, size = 1.5)) +
  scale_x_date(date_breaks="1 month") +
  theme(axis.text.x = element_text(angle = 40, hjust = 1))

Выход:

enter image description here


Данные:

mich_pols <- structure(list(pollster = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 
1L, 2L, 2L, 2L, 2L), .Label = c("EPIC-MRA", "Glengariff Group, Inc."
), class = "factor"), enddate = structure(c(18287, 18343, 18478, 
18518, 18538, 18559, 18569, 18408, 18475, 18533, 18546), class = "Date"), 
    rawpoll_clinton = c(51.2, 56, 57.3, 52.1, 57.3, 54.7, 52.5, 
    52.9, 56.5, 54.5, 58), rawpoll_trump = c(48.8, 44, 42.7, 
    47.9, 42.7, 45.3, 47.5, 47.1, 43.5, 45.5, 42)), row.names = c("4208", 
"4168", "4162", "1187", "747", "368", "124", "3132", "2282", 
"789", "436"), class = "data.frame")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...