2016-08-01 22 views
-1

Ich habe eine Frage zum Formatieren der X-Achse als Zeit. ggplot2 Achse als Zeit mit 1 Stunde Fehler

Dies ist ein Beispiel meiner Daten:

dput(x) 
structure(list(Sample = c("BK01", "BK02", "BK03", "BK04", "BK05", 
"BK06", "BK07", "BK08", "BK09", "BK10", "BK11", "BK12", "BK13", 
"BK14", "BK15", "BK16", "BK17", "BK18", "BK19", "BK20", "BK21", 
"BK22", "BK23", "BK24", "BK25", "BK26", "BK27", "BK28", "BK29", 
"BK30", "BK31", "BK32", "BK33"), Breath.d13C = c(-25.62, -27.45, 
-26.87, -25.21, -26.01, -24.33, -24.45, -23.73, -25.05, -26.11, 
-27, -26.28, -24.62, -26.96, -24.55, -24.52, -21.24, -26.18, 
-24.82, -26.12, -27.28, -26.5, -24.46, -22.83, -27.28, -25.55, 
-27.12, -24.46, -23.07, -28.35, NA, -25.98, -26.64), Chms = structure(c(1470047400, 
1470048300, 1470048300, 1470049200, 1470050100, 1470050100, 1470040200, 
1470041100, 1470040200, 1470041100, 1470065400, 1470063600, 1470063600, 
1470064500, 1470061800, 1470045600, 1470045600, 1470046500, 1470047400, 
1470066300, 1470060000, 1470058200, 1470057300, 1470047400, 1470042000, 
1470042000, 1470041100, 1470041100, 1470040200, 1470043800, NA, 
1470060000, 1470039300), class = c("POSIXct", "POSIXt"), tzone = "")), class = "data.frame", row.names = c(NA, 
-33L), .Names = c("Sample", "Breath.d13C", "Chms")) 

Ich möchte ggplot2 verwenden, um eine grafische Darstellung von Breath.d13C vs cHMS (Sammlung Zeit) zu bauen.

library(ggplot2) 

ggplot(x, aes(x=Chms,y=Breath.d13C)) + 
geom_point() + 
    scale_y_continuous(name=expression(delta^13*C["Breath"]*" "("\u2030")), 
        limits=c(-30,-10), 
        breaks=seq(-30,-10,5), 
        labels=fmt_decimals(1)) + 
    scale_x_datetime(name="Collection Time", 
        labels = date_format("%H:00",tz="UTC"), 
        date_breaks = "1 hour") + 
    my_theme 

Dieser Code gibt mir this. Allerdings sind die Zeiten um eine Stunde abgelaufen. Das kann ich sehen, indem Sie die Chms Spalte überprüft oder durch die normalen R Plots mit R plots

mit diesem Code:

plot(x$Chms,x$Breath.d13C,cex=0.8) 

Die beiden Parzellen verwenden die gleichen Datenbestand, so habe ich keine Ahnung, was das verursacht hat Fehler auf ggplot2. Ich würde es gerne weiter benutzen. Irgendwelche Ideen zu was mache ich falsch?

Vielen Dank im Voraus

+0

'Fehler in check_breaks_labels (Brüche, Etiketten): konnte nicht funktionieren "fmt_decimals" finden'. Haben Sie diese Funktion verwendet: 'fmt_dcimals <- function (dezimals = 0) { # gibt eine Funktion zurück, die für die Formatierung der # Achsenbeschriftungen mit einer gegebenen Anzahl von Dezimalstellen Funktion (x) as.character (round (x, Dezimalzahlen))) } Und auch, was ist 'my_theme'? – Miha

Antwort

1

Sie müssen in scale_x_datetime die Zeitzone angeben.

Die Funktion date_format() ist standardmäßig auf "UTC" eingestellt. Daher werden Ihre Etiketten in UTC konvertiert. Um die Zeitzone z.B. Früher habe ich „Europa/London“ (gewünschten Ausgang erhalten), können Sie die folgenden in Ihrem ggplot Code tun: labels = date_format("%H:%M", tz = "Europe/London")

Aber erstens , um Ihren Code laufen musste ich auch definieren, was Sie angegeben im Code als fmt_decimals so habe ich diese Funktion von @joran gegeben:

fmt_dcimals <- function(decimals=0){ 
    # return a function responpsible for formatting the 
    # axis labels with a given number of decimals 
    function(x) as.character(round(x,decimals)) 
} 

so Ihr Code wie folgt aussieht:

ggplot(x, aes(x=Chms,y=Breath.d13C)) + 
    geom_point() + 
    scale_y_continuous(name=expression(delta^13*C["Breath"]*" "("\u2030")), 
        limits=c(-30,-10), 
        breaks=seq(-30,-10,5), 
        labels=fmt_dcimals(1)) + 
    scale_x_datetime(name="Collection Time", 
        labels = date_format("%H:%M", tz = "Europe/London"), 
        date_breaks = "1 hour") 

und Ausgang:

enter image description here

+0

Danke! Ich vermutete, dass es mit der Zeitzone zu tun hatte. Aber es gelang ihm nicht, es zu umgehen. (Entschuldigung, ich habe vergessen, die Funktion für 'fct_decimals' einzuschließen, aber Sie haben richtig geraten) – answer42

+0

@ answer42 Vergnügen zu helfen. – Miha

1

Das Problem liegt in der Zeitzone, die Sie wählen, das heißt UTC. Sie sollten die aktuelle Zeitzone auswählen. Der korrigierte Code ist wie unten

 library(ggplot2) 
    ggplot(x, aes(x=Chms,y=Breath.d13C)) + 
     geom_point() + 
     scale_y_continuous(name=expression(delta^13*C["Breath"]*" " 
     ("\u2030")), 
       limits=c(-30,-10), 
       breaks=seq(-30,-10,5)) + 
     scale_x_datetime(name="Collection Time", 
       labels = date_format("2016-08-01 %H:00",""), 
       date_breaks = "1 hour") 

See the plot as belpw