Discussion:
Frage zu R
(zu alt für eine Antwort)
Peter Schütt
2025-01-24 21:54:25 UTC
Permalink
Hallo,
ich mache mir simple Linien-Diagramme mit R, was auch ganz funktioniert,
aber ich würde gerne die Werte, die automatisch auf der X-Achse gezeigt
werden, beeinflussen.

Ich habe Verbrauchswerte von meinem Haus von 2017 bis heute mit dem
Erfassungsdatum auf der X-Achse auf einen Tag kumuliert.

Automatisch zeigt er nur jedes zweite Jahr an.

Ich hätte gerne, dass er jedes Jahr anzeigt und die Monate als Striche.

Ich bin noch ein Anfänger in R, hätte tatsächlich aber erwartet, dass
das nicht schwer ist, doch suche ich schon zwei Stunden im Netz.

Danke für alle Hinweise und Tips.

Viele Grüße
Peter Schütt
Stefan Ram
2025-01-26 10:13:16 UTC
Permalink
Post by Peter Schütt
Ich hätte gerne, dass er jedes Jahr anzeigt und die Monate als Striche.
(Ich habe selber keine Ahnung von "R". Daher konnte ich die folgenden
Tips nicht überprüfen!)

Okay, hier kommt's für dich als R-Anfänger:

Um deine X-Achse im Liniendiagramm richtig cool zu gestalten,
brauchste 'ne kleine Trickkiste mit der axis() Funktion.

Lass mich Dir zeigen, wie du das easy hinbekommst!

Erst mal bastelst Du Dir ein Grunddiagramm ohne X-Achse:

R

plot(deine_daten$Datum, deine_daten$Verbrauch, type="l", xaxt="n", xlab="Jahr", ylab="Verbrauch")

Dann definierst du die Jahre - ganz entspannt:

R

jahre <- seq(from=as.Date("2017-01-01"), to=max(deine_daten$Datum), by="year")

Nu kommn die Jahresbeschriftungen:

R

axis(1, at=jahre, labels=format(jahre, "%Y"))

Und zum Schluß noch die feinen Monatsstriche:

R

monate <- seq(from=as.Date("2017-01-01"), to=max(deine_daten$Datum), by="month")
axis(1, at=monate, labels=FALSE, tcl=-0.2)

Der ganze Zauber sieht dann so aus:

R

# Basis-Diagramm wird gezaubert
plot(deine_daten$Datum, deine_daten$Verbrauch, type="l", xaxt="n", xlab="Jahr", ylab="Verbrauch")

# Jahre und Monate werden festgelegt
jahre <- seq(from=as.Date("2017-01-01"), to=max(deine_daten$Datum), by="year")
monate <- seq(from=as.Date("2017-01-01"), to=max(deine_daten$Datum), by="month")

# Jahresbeschriftungen kommen drauf
axis(1, at=jahre, labels=format(jahre, "%Y"))

# Monatsstriche werden gesetzt
axis(1, at=monate, labels=FALSE, tcl=-0.2)

Keine Sorge - das sieht am Ende viel komplizierter aus, als
es ist! Mit 'nem Schluck Kaffee und bißchen Übung kriegste
das locker hin.

Wichtig noch: Wenn deine Daten noch nicht im Datumsformat sind,
mußte die erst mit as.Date() umwandeln. Aber keine Angst -
auch das ist nicht die Raketenwissenschaft!
Peter Schütt
2025-01-26 22:15:24 UTC
Permalink
Hallo,
es hat geklappt, vielen Dank.

Das einzige, was neben dem komischen Sprachstil seltsam war, war, dass
ich als Startwert den 1.1.2017 konstant nehmen musste.
# start_date <- as.Date(min(netzbezug_result$measure_day))
end_date <- as.Date(max(netzbezug_result$measure_day))

# start_date als from führt zur einer falschen Skala
jahre <- seq(from=as.Date("2017-01-01"), to=end_date, by="year")
monate <- seq(from=as.Date("2017-01-01"), to=end_date, by="month")

axis(1, at=jahre, labels=format(jahre, "%Y"))
axis(1, at=monate, labels=FALSE, tcl=-0.2)
<<<<<

Wenn ich das minimale Datum (hier start_date) berechnet habe (war August
2017), dann war die Skala verschoben, was ich nicht verstanden habe.
Aber egal: Ich habe eine funktionierende Lösung.

Viele Grüße
Peter Schütt
Post by Stefan Ram
Post by Peter Schütt
Ich hätte gerne, dass er jedes Jahr anzeigt und die Monate als Striche.
(Ich habe selber keine Ahnung von "R". Daher konnte ich die folgenden
Tips nicht überprüfen!)
Um deine X-Achse im Liniendiagramm richtig cool zu gestalten,
brauchste 'ne kleine Trickkiste mit der axis() Funktion.
Lass mich Dir zeigen, wie du das easy hinbekommst!
R
plot(deine_daten$Datum, deine_daten$Verbrauch, type="l", xaxt="n", xlab="Jahr", ylab="Verbrauch")
R
jahre <- seq(from=as.Date("2017-01-01"), to=max(deine_daten$Datum), by="year")
R
axis(1, at=jahre, labels=format(jahre, "%Y"))
R
monate <- seq(from=as.Date("2017-01-01"), to=max(deine_daten$Datum), by="month")
axis(1, at=monate, labels=FALSE, tcl=-0.2)
R
# Basis-Diagramm wird gezaubert
plot(deine_daten$Datum, deine_daten$Verbrauch, type="l", xaxt="n", xlab="Jahr", ylab="Verbrauch")
# Jahre und Monate werden festgelegt
jahre <- seq(from=as.Date("2017-01-01"), to=max(deine_daten$Datum), by="year")
monate <- seq(from=as.Date("2017-01-01"), to=max(deine_daten$Datum), by="month")
# Jahresbeschriftungen kommen drauf
axis(1, at=jahre, labels=format(jahre, "%Y"))
# Monatsstriche werden gesetzt
axis(1, at=monate, labels=FALSE, tcl=-0.2)
Keine Sorge - das sieht am Ende viel komplizierter aus, als
es ist! Mit 'nem Schluck Kaffee und bißchen Übung kriegste
das locker hin.
Wichtig noch: Wenn deine Daten noch nicht im Datumsformat sind,
mußte die erst mit as.Date() umwandeln. Aber keine Angst -
auch das ist nicht die Raketenwissenschaft!
Stefan Ram
2025-01-27 10:31:53 UTC
Permalink
Post by Peter Schütt
Das einzige, was neben dem komischen Sprachstil seltsam war, war, dass
ich als Startwert den 1.1.2017 konstant nehmen musste.
Hier wieder ein Hinweis, den ich nicht selber überprüft habe. (Den
"komischen Sprachstil" habe ich extra eingebaut, um nicht hölzer oder
förmlich zu klingen und meine Herkunft [Berlin] auszudrücken.)

Wenn De "2017-01-01" als Startdatum nimmst, fängt die janze
Chose am 1. Januar 2017 an. Dit sorgt dafür, datTe 'ne schöne
Jahreseinteilung hast, wo jedes Jahr jenau am Neujahrstag losjeht.

Aber wenn De stattdessen dit "start_date" (August 2017) nimmst,
fängt die Sache mitten im Jahr an. Und dit führt dazu, daß:

- Die Jahresstriche nich mehr mitm Jahresanfang
übereinstimmen.

- Die Abstände zwischen den Jahren komisch aussehn können.

DamitTe immer 'ne ordentliche Darstellung hast, egal wann Deine
Daten anfangen, kannsTe dit hier probieren:

R

# Finde den Neujahrstag von dem Jahr, wo Deine Daten losjehen
start_year <- format(start_date, "%Y")
adjusted_start <- as.Date(paste0(start_year, "-01-01"))

# Nimm dit neue Startdatum für Deine Reihen
jahre <- seq(from=adjusted_start, to=end_date, by="year")
monate <- seq(from=adjusted_start, to=end_date, by="month")

# Der Rest bleibt, wie er is
axis(1, at=jahre, labels=format(jahre, "%Y"))
axis(1, at=monate, labels=FALSE, tcl=-0.2)

Dit hier sorgt dafür, datTe Deine X-Achse immer am Neujahrstag
vom ersten Jahr von Deine Daten anfängt. So kriegste 'ne
vernünftige Zeitachse hin.
Patrick Rudin
2025-01-31 16:52:56 UTC
Permalink
Post by Peter Schütt
Ich bin noch ein Anfänger in R, hätte tatsächlich aber erwartet, dass
das nicht schwer ist, doch suche ich schon zwei Stunden im Netz.
Auch wenn Du bereits eine Lösung hast, dennoch der Hinweis: Ich benutze
kein Base-R, weil ich die Syntax schröcklich(tm) finde.

Bei der Erweiterung Tidyverse (diverse Pakete) nimmt man für das Plotten
ggplot, wo Daten und Aussehen sauber getrennt sind. Das erfordert wie
alles eine gewisse Eingewöhnung, aber auf die lange Sicht lässt es sich
damit einfach besser arbeiten.

https://r4ds.had.co.nz/data-visualisation.html

Zu Deinem Punkt dann insbesondere
https://ggplot2-book.org/scales-position

Das Cheatsheet dazu ist auch immer nützlich, ganz unten sind auch
weitere gute Einführungen beschrieben:
https://ggplot2.tidyverse.org/


Gruss

Patrick

Loading...