Balken- und Liniendiagramm in einer Grafik

Wie erstelle ich Grafiken, was ist zu beachten?

Moderatoren: EDi, jogo

Antworten
flo_
Beiträge: 5
Registriert: Mi Apr 13, 2022 2:52 pm

Balken- und Liniendiagramm in einer Grafik

Beitrag von flo_ »

Hallo!

Ich habe leider noch kaum eine Ahnung von R und soll nun Daten in folgender Grafik darstellen:
Bild

Wie bekommt man zwei unterschiedliche y-Achsen zustande und wie bekommt man das Säulendiagramm nach unten sowie den Liniengraph darüber? Bestimmt mit ggplot(), aber wie sehen da die Codes genau aus?

Code: Alles auswählen

ggplot(data_aistersheim, aes(x = time, y = SPEI))+
  geom_line(size=0.2, color = "red")
Wäre euch sehr dankbar, falls jemand von euch ein paar Tipps für mich hätte!
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Balken- und Liniendiagramm in einer Grafik

Beitrag von bigben »

Hallo flo_,

willkommen im Forum.
flo_ hat geschrieben: Mi Apr 13, 2022 2:59 pm Bestimmt mit ggplot(), aber wie sehen da die Codes genau aus?
Ist die Wahl von ggplot2 eine Vorgabe, ist es Dein Wunsch oder ist es nur eine voreilige Annahme, dass das bestimmt immer am besten ist?

Lass das hier mal bei Dir laufen und schau Dir eine base Grafik an, die man sicher noch weiter verbessern kann.

Code: Alles auswählen

set.seed(23)
regen <- pmax(cumsum(rnorm(500)), 0)
SPI <- cumsum(rnorm(500)/3)

par(mar = c(5, 4, 4, 4))
plot(regen, type = "h", col ="blue", ylim = c(0, 20), ylab = "Regen")
abline(h = c(7.5, 10, 12.5), lty = 2, col = "grey")
lines(.3 * SPI + 10, col = "red")
axis(4, col = "red", col.axis = "red",
     at = c(5, 7.5, 10, 12.5, 15),
     labels = c(-2, -1, 0, 1, 2))
mtext("SPI", side = 4, col = "red", line = 3)
Muss es automatisch ggplot2 sein?

Wenn ja, hier wäre ein (noch unfertiger) Schnellschuss in ggplot2:

Code: Alles auswählen

library(ggplot2)
ggplot(data.frame(time = 1:500, regen = regen, spi = SPI)) +
  geom_col(aes(x = time, y = regen), color = "blue", alpha = .3) +
  geom_line(aes(x = time, y = spi+10), color = "red") +
  scale_y_continuous(sec.axis = sec_axis( trans =~(./4)-2.5, name = "SPI"),
                     limits = c(0, 20))
Geht das in die richtige Richtung? Kannst Du damit arbeiten?

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
flo_
Beiträge: 5
Registriert: Mi Apr 13, 2022 2:52 pm

Re: Balken- und Liniendiagramm in einer Grafik

Beitrag von flo_ »

Hallo Bernhard,

ist nur eine Annahme von mir nach Durchsicht einzelner Videos.

Das sieht auf jeden Fall schon mal gut aus! nur bin ich mit den ganzen Befehlen überfordert :oops:
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Balken- und Liniendiagramm in einer Grafik

Beitrag von bigben »

Hallo Flo,

nun, wir sind zwar nicht hier, um Deinen Code zu schreiben, aber wir sind hier, um Dir zu helfen. Vorweg möchte ich noch sagen, dass ggplot2 sich lange gegen eine zweite y-Achse gesperrt hat. Dafür gibt es gute Gründe und ich möchte Dich bitten, Dir diesen Blogbeitrag anzuschauen, bevor Du weiter machst: https://blog.datawrapper.de/dualaxis/
nur bin ich mit den ganzen Befehlen überfordert
Nun, dann solltest Du Dich als erstes entscheiden, in welches der vielen R-Grafiksysteme Du Dich für dieses Projekt einarbeiten möchtest. Wenn Du mit einem schon Vorerfahrungen hast, nimm das. Wenn Du ohnehin von vorne anfängst, dann hast Du die freie Wahl. Wenn ich etwas raten müsste, hätte ich eine sanfte Tendenz zu ggplot2, aber dass es sowohl in base als auch in ggplot2 klappen wird, hast Du ja gesehen. Über highchartr, ggvis und wie sie alle heißen kann ich zu wenig sagen. Geht bestimmt auch alles irgendwie, aber ich weiß nicht, wie gut da die Unterstützung durch das Forum sein wird.

Was sind Deine Vorkenntnisse? Nur Youtube-Videos?
LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
flo_
Beiträge: 5
Registriert: Mi Apr 13, 2022 2:52 pm

Re: Balken- und Liniendiagramm in einer Grafik

Beitrag von flo_ »

Danke für die Info.

Ja, ich habe mein "Vorwissen" aktuell aus Youtube-Videos und ein paar Internetseiten.

Bei ggplot2() weiß ich halt, dass dieses mit den 3 Ebenen arbeitet und das klingt logisch für mich, nur fehlen mir die ganzen Bausteine wie ich zB. Achsenwerte umstelle (zB. Skalierung der X-Achse, welche ein Datumformat hat).
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Balken- und Liniendiagramm in einer Grafik

Beitrag von bigben »

Hallo flo_,

solche Videos sind ein netter Einstieg, aber meist sind die Videos zu kurz, um ein Thema erschöpfend zu behandeln und dann fehlt nach dem Video das passende Anschlussvideo. ggplot2 ist trügerisch: Wenn man schnell einen Standardplot haben will, geht alles ganz einfach in wenigen Zeilen und man kann im Video leicht glänzen. Wenn man dann aber in die Details will, finde ich das oft gar nicht mehr so einfach.

Daten auf der x-Achse erfordert erstmal, dass die Daten in R korrekt als Datum vorliegen, nicht nur als Text, der für uns wie ein Datum aussieht. Ordnet man eine Datumsvariable der x-Achse zu, dann erkenn aes() das und fabriziert eine brauchbare Standardachse.

Code: Alles auswählen

bsp <- data.frame(datum = as.Date("2022-04-13")+1:20,
                  value = sample.int(8,20, 1))
head(bsp)
ggplot(bsp, aes(x = datum, y = value)) +
  geom_point() +
  geom_line()
Will man mehr Kontrolle über die Achse, gibt es dafür scale_x_date. Auf diesem Niveau finden sich aber mit jeder Suchmaschine im Netz immer brauchbare Erklärungen oder Beispielcode.

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
flo_
Beiträge: 5
Registriert: Mi Apr 13, 2022 2:52 pm

Re: Balken- und Liniendiagramm in einer Grafik

Beitrag von flo_ »

Hallo Bernhard,

danke!

Code: Alles auswählen

ggplot(data_aistersheim,aes(x = time))+
  geom_col(aes(x = time, y = RR), color = "blue", alpha = .3)+
  geom_line(aes(x = time, y = SPEI+4), color = "red")+
  scale_y_continuous(sec.axis = sec_axis(~.-4, name = "SPEI"), 
                     limits = c(0,5))+
  scale_x_date(date_labels = "%b %y", name = "Jahr")+
  abline(h = 0, col = "grey", lwd = 2, lty = 2 )+
  theme_classic()+ labs(title = "Zeitskala: Tage", subtitle = "Aistersheim
                        1961 - 2021")
Bin aktuell so weit gekommen.
Wie kann ich die geom_line größer darstellen, also das die Skalierung des Liniengraphen größer wird und mit der zweiten y-Achse zusammenpasst?
Ich kann noch nicht ganz nachvollziehen, was mit "(trans =~(./4)-0.2" dargestellt bzw. eingestellt wird.

LG Flo
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Balken- und Liniendiagramm in einer Grafik

Beitrag von bigben »

Hallo Flo,

Code wie Du ihn gepostet hast ist für uns alle ein wenig blöd, weil wir ihn nicht bei uns laufen lassen können und bei uns keine Verbesserungsversuche ausprobieren können, weil wir die Variable data_aistersheim nicht haben. Für die Kommunikation im Forum ist es daher immer günstig, nicht nur Code, sondern auch geeignete Daten zum Laufenlassen des Codes zu haben. Entweder eine CSV-Datei zum einlesen oder Code, der geeignete Daten produziert (wie ich das oben gemacht habe) oder einen Datenauszug mit dput. EDi hat dazu mal eine Zusammenfassung geschrieben, die Du hier finden kannst: viewtopic.php?t=11

Wie ich schon geschrieben habe, wollte der Erfinder von ggplot2 lange keine zweiten y-Achsen haben. Er hat sie dann nachgeschoben, aber eben nur aufgeflanscht. Eigentlich gibt es nur eine y-Achse und die zweite Achse ist immer eine Transformation der ersten. In diesem Fall lautet die Transformationsanweisung also "geteilt durch 4 und dann plus 2". Der Punkt steht immer für den Achsenwert der links angezeigt wird. Damit entscheidest Du, wo der Nullpunkt der rechten Achse liegt und wieviel größer oder kleiner die Abstände auf der rechten Achse sind als auf der linken. Probier einfach aus, was passiert, wenn Du die Werte gefühlvoll änderst. Die Originaldokumentation ist hier: https://ggplot2.tidyverse.org/reference/sec_axis.html

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Antworten