2017-05-18 5 views
1

Ich möchte ein Streudiagramm eines Datenrahmens mit einer Datumsspalte erstellen. Die x-Achse sollte monatlich geteilt werden oder für jeweils 2 Monate in den letzten 2 Jahren.Definieren einer Datums-X-Achse in einem Streudiagramm (R)

Der Datenrahmen:

code_1000 <- 
    as.data.frame(cbind(
    c("3", "3", "7", "7", "7", "7", "2", "2", "4", "4"), 
    c("344", "344", "73", "73", "71", "72", "21", "27", "42", "43"), 
    c("9-02-2017", "10-01-2016","9-02-2014", "25-03-2015", "9-02-2017", 
     "10-06-2017", "8-04-2017", "25-08-2016", "07-08-2017", "15-09-2016" 
    ) 
)) 
names(code_1000) <- c("number", "code", "date") 

Das Grundstück Code:

qplot(data=code_1000, 
     x=format(as.Date(date),"%b/%Y"), 
     y=code, 
     geom=c("point"), 
     na.rm=TRUE, 
     xlab="Emission date", ylab="Code", 
     size=1, col=2)+theme_bw()+theme(legend.position="none") 

I code auf der y-Achse und date auf der x-Achse dargestellt werden soll. Wie kann ich erzwingen, dass die x-Achse monatlich geteilt wird? Wenn ich meinen Plot-Code ausführe, sieht das x-Achsenformat wie folgt aus: mm/dddd, aber ich möchte mm/yyyy. Warum bekomme ich dieses Format?

Ich habe ~ 50 Datenrahmen wie code_1000 in einer glänzenden App. Um die Dinge einfacher zu machen, teile ich nicht den gesamten Code.

Vielen Dank im Voraus!

Antwort

1

Ich denke, der Standard-Datums-Parser ist nur durch Ihre DD-MM-YYY-Notation verwirrt. Wenn Sie die Termine mit lubridate, die x-Achse analysieren sieht mehr angemessen (wenn auch möglicherweise nicht mit der Major/Minor ticks Sie wollen.)

ich Ihre Neuformatierung der Daten innerhalb von qplot entfernt und eine Skalierungsfunktion hinzugefügt .

library(lubridate) 
library(scales) 

# implicit in poster's question 
library(ggplot2) 

code_1000$date <- lubridate::dmy(as.character(code_1000$date)) 

qplot(
    data = code_1000, 
    x = date, 
    y = code, 
    geom = c("point"), 
    na.rm = TRUE, 
    xlab = "Emission date", 
    ylab = "Code", 
    size = 1, 
    col = 2 
) + theme_bw() + theme(legend.position = "none") + scale_x_date(
    date_breaks = "1 year", 
    date_minor_breaks = "1 month", 
    labels = date_format("%m-%Y") 
) 

enter image description here

0

beendet Meine Lösung sehr ähnlich hoch oben auf @MarkMiller, außer bei lubridate mein Versuch arbeiten gescheitert. Ich habe stattdessen strptime verwendet, um die Daten zu konvertieren.

code_1000$date <- strptime(code_1000$date, format = "%d-%M-%Y") 

auch finde ich ggplot Funktion flexibler und prägnant zu sein, statt qplot. Innerhalb einer Shiny App besonders könnte qplot variable Ergebnisse geben (?):

library(tidyverse) 
library(scales) # needed for date_format() 
ggplot(code_1000, aes(date, code)) + 
    geom_point(size=2, col="steelblue") + 
    theme_bw() + 
    labs(x="Emission Date", y="Code") + 
    scale_x_datetime(labels = date_format("%m/%Y")) 

Wenn Sie die Grenzen festlegen möchten über Shiny Plots konsistent sein, bestimmte Fristen:

limits <- strptime(c("01-01-2014", "01-01-2018"), format = "%d-%m-%Y") 
ggplot(code_1000, aes(date, code)) + 
    geom_point(size=2, col="steelblue") + theme_bw() + 
    labs(x="Emission Date", y="Code") + 
    scale_x_datetime(labels = date_format("%m-%Y"), #minor_breaks = "1 month" 
        date_breaks = "1 year", limits = as.POSIXct(limits)) 
+0

Vielen Dank für Ihre Antwort Matt! Wenn ich code_1000 $ date <- strptime (code_1000 $ date, format = "% d-% M-% Y") ausführen, wird die Datumsspalte . Kennst du den Grund, warum es passiert? Danke noch einmal. –

+0

Ich kann nicht reproduzieren- es funktioniert gut für mich mit nur Basis-Pakete bis zu diesem Punkt, mit allem kopiert von dieser Seite. Versuchen Sie, R neu zu starten, und laden Sie keine Pakete - möglicherweise ein Konflikt mit einer Paketfunktion? Ich habe meine Antwort überarbeitet, um die für die Handlung benötigten Pakete einzubeziehen. –

0

Danke sehr viel für deine Antwort Jungs!

Ich habe Schwierigkeiten, dieses Datumsformat für meine Datenrahmen in Shiny anzuwenden.

Anstelle eines Datenrahmens code_1000 habe ich 51 verschiedene Datenrahmen, benannt von code_1000 bis code_1050. Ich möchte dieses Datumsformat in dem Datenrahmen

code_1000$date <- lubridate::dmy(as.character(code_1000$date)) 

auf alle date Spalten anwenden. Ich habe versucht, es mit for zu tun, aber es wurde irgendwie verwirrend und hat nicht funktioniert.

for (m in 1:nrow(input)){ 

    assign(paste0("code_",input$code.numbers[m])$date, lubridate::dmy(as.character(eval(parse(text=paste0("code_",input$code.numbers[m])))$date))) 

    } 

Wo die input$code.numbers ein Datenrahmen ist, der die Zahlen enthält, die den Datenrahmen (1000-1050) benannt. Ich habe folgende Fehlermeldung:

Error in paste0("code_",input$code.numbers[m])$date : 
    $ operator is invalid for atomic vectors 

Ich mag würde lernen, wie dies mit for und lapply() Funktion zu tun, wie ich in gelesen, dass R lapply() ist ein einfacher Ansatz die meisten Zeiten.

+0

Sie könnten dies als eine andere Frage, als es ist deutlich anders als das Original ... Ich möchte lernen, purr :: map-Funktionen für dieses Problem Typ zu verwenden. Wenn sie alle bis auf eine Variable ziemlich identisch sind, könnten Sie sie zu einem Datenformat im Längsformat zusammenführen, mit dem Sie leichter arbeiten können? würde mehr Informationen benötigen, um zu antworten –

Verwandte Themen