Automatischer Zeilenumbruch ggplot

Wie erstelle ich Grafiken, was ist zu beachten?

Moderatoren: EDi, jogo

Antworten
flip_0207
Beiträge: 11
Registriert: Do Dez 06, 2018 7:46 pm

Automatischer Zeilenumbruch ggplot

Beitrag von flip_0207 » Fr Jun 21, 2019 12:02 pm

Hallo

Für eine Abschlussarbeit bereite ich einen umfangreichen Datensatz mit R auf. Dazu muss ich Grafiken erstellen, wozu ich die ggplot Funktionen benutze. Leider bin ich dabei auf ein Problem gestoßen:

-Die Achsenbeschriftung besteht teilweise aus mehreren Wörtern. Da ich nicht mit Abkürzungen arbeiten möchte und die insgesamt etwa 30 Grafiken quasi fertig sind, suche ich nun nach einer Möglichkeit, einen automatischen Zeilenumbruch einzubauen. Dieses funktionierende Beispiel konnte ich im Internet finden, leider kann ich es nicht auf meine Daten übertragen bzw. in meinem Skript funktioniert es nicht. Vielleicht kennt jemand eine andere, ähnlich einfache Möglichkeit mein Problem zu lösen?

Code: Alles auswählen

library(tidyverse)
library(OIdata)
data(birds)
library(ggplot2)

levels(birds$effect) <- gsub(" ", "\n", levels(birds$effect))
ggplot(birds,
       aes(x = effect,
           y = speed)) +
  geom_boxplot()

Benutzeravatar
EDi
Beiträge: 887
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Automatischer Zeilenumbruch ggplot

Beitrag von EDi » Fr Jun 21, 2019 11:42 pm

flip_0207 hat geschrieben:
Fr Jun 21, 2019 12:02 pm
Dieses funktionierende Beispiel konnte ich im Internet finden, leider kann ich es nicht auf meine Daten übertragen bzw. in meinem Skript funktioniert es nicht. Vielleicht kennt jemand eine andere, ähnlich einfache Möglichkeit mein Problem zu lösen?
Wie sollen wir da gute Hilfe geben, wenn wir nicht deine Daten oder Skript kennen wo es schief läuft?

siehe auch https://stackoverflow.com/questions/596 ... le-example
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.

dvf
Beiträge: 19
Registriert: Mo Feb 27, 2017 12:44 pm

Re: Automatischer Zeilenumbruch ggplot

Beitrag von dvf » Mo Jun 24, 2019 4:50 pm

Der Backslash mit nachfolgendem n bewirkt einen Zeilenumbruch. Ist im angeführten Beispiel mit den Vögeln auch nicht automatisch, sondern händisch gesetzt. Siehe

Code: Alles auswählen

levels(birds$effect)

Code: Alles auswählen

plot(1:10, 1:10)
text(7, 4, "Precautionary\nLanding") 
dvf

flip_0207
Beiträge: 11
Registriert: Do Dez 06, 2018 7:46 pm

Re: Automatischer Zeilenumbruch ggplot

Beitrag von flip_0207 » Mo Jun 24, 2019 9:05 pm

Danke für die bisherigen Antworten!

Da ich die Daten nicht einfach so veröffentlichen kann und möchte, habe ich mal ein ähnliches Beispiel erstellt und in den Anhang gepackt.
Wie oben beschrieben, gibt es momentan keine Alternative was die Beschriftung angeht, ich benötige die vollen Namen. Da die Grafiken recht komplex sind, und ich die groups für die "Tabelle" aus dem Tukey-Test ziehe, bin ich auch auf ggplot angewiesen.

Vielleicht gibt es ja eine Möglichkeit, mein Problem zu lösen?

Code: Alles auswählen

library(tidyverse)
library(ggpubr)

#Vorbereitungen

Rohdaten <- read.csv2("Zeilenumbruch_Beispiel.csv")
Statistik <- read.csv2("Statistik.csv")

Statistik$Blattetage <- as.factor(Statistik$Blattetage)

Thema_Beispiel <- theme(panel.background = element_rect(fill = "white"),
                   axis.line = element_line())

Farben_Arten <- c("Lupinus angustifolius var. Azuro"="blue", "Triticum aestivum var. Bosporus"="darkgreen")

#Grafik

Grafik <- ggplot(Rohdaten,
       aes(x=Wuchshöhe, y=Stängeldurchmesser, col=Art))+
  geom_line()+
  geom_point(size=3)+
  xlab("Wuchshöhe [cm]")+
  ylab("Stängeldurchmesser [mm]")+
  geom_vline(xintercept = 35,linetype = 2)+
  geom_vline(xintercept = 65,linetype = 2)+
  scale_y_continuous(position = "right",limits = c(0,50), breaks = c(0, 10, 20, 30, 40, 50),labels = c("0","10","20","30","40","50"))+
  scale_x_continuous(breaks = c(10, 20, 30, 40, 50, 60, 70, 80, 90), labels = c("10","20","30","40","50","60","70","80","90"))+
  scale_color_manual(values = Farben_Arten)+
  theme(axis.text.x = element_text(size = 15, face="bold"))+
  theme(axis.text.y = element_text(size = 15, face="bold"))+
  theme(axis.title.x = element_text(size =17))+
  theme(axis.title.y = element_text(size = 17))+
  theme(legend.title = element_text(size = 14, face="bold"))+
  theme(legend.text = element_text(size = 14))+
  Thema_Beispiel+
  coord_flip()

#Tabelle

Tabelle <- ggplot(Statistik, aes(x=Blattetage, y=Art, label=groups))+
  geom_text()+
  scale_y_discrete(position = "right")+
  theme(axis.text.x = element_text(size = 15, face = "bold"))+
  theme(axis.text.y = element_text(size = 15, face = "bold"))+
  theme(axis.title.x = element_text(size =17))+
  theme(axis.title.y = element_text(size = 17))+
  theme(legend.title = element_text(size = 14, face="bold"))+
  theme(legend.text = element_text(size = 14))+
  Thema_Beispiel+
  coord_flip()

#Gesamtdarstellung

ggarrange(Grafik, Tabelle)

Dateianhänge
Zeilenumbruch_Beispiel.csv
(748 Bytes) 7-mal heruntergeladen
Statistik.csv
(249 Bytes) 4-mal heruntergeladen

Benutzeravatar
EDi
Beiträge: 887
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Automatischer Zeilenumbruch ggplot

Beitrag von EDi » Di Jun 25, 2019 10:38 pm

Das sollte es tun:

Code: Alles auswählen

Rohdaten <- Rohdaten %>%
  mutate(Art = gsub(" var", "\\\nvar", Art))
Farben_Arten <- c("Lupinus angustifolius\nvar. Azuro"="blue", "Triticum aestivum\nvar. Bosporus"="darkgreen")
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.

flip_0207
Beiträge: 11
Registriert: Do Dez 06, 2018 7:46 pm

Re: Automatischer Zeilenumbruch ggplot

Beitrag von flip_0207 » Do Jun 27, 2019 6:46 pm

EDi hat geschrieben:
Di Jun 25, 2019 10:38 pm
Das sollte es tun:

Code: Alles auswählen

Rohdaten <- Rohdaten %>%
  mutate(Art = gsub(" var", "\\\nvar", Art))
Farben_Arten <- c("Lupinus angustifolius\nvar. Azuro"="blue", "Triticum aestivum\nvar. Bosporus"="darkgreen")
Danke! Das funktioniert schon einmal für die Legende. Leider habe ich es nicht geschafft, dass die Achsenbeschriftung für die Tabelle den Zeilenumbruch auch macht. Da liegt nämlich das Kernproblem. Gibt es dafür noch eine Möglichkeit? So sieht mein Skript jetzt aus:

Code: Alles auswählen

library(tidyverse)
library(ggpubr)

#Vorbereitungen

Rohdaten <- read.csv2("Zeilenumbruch_Beispiel.csv")
Statistik <- read.csv2("Statistik.csv")

Statistik$Blattetage <- as.factor(Statistik$Blattetage)

Thema_Beispiel <- theme(panel.background = element_rect(fill = "white"),
                   axis.line = element_line())

Rohdaten <- Rohdaten %>%
  mutate(Art = gsub(" var", "\\\nvar", Art))
Farben_Arten <- c("Lupinus angustifolius\nvar. Azuro"="blue", "Triticum aestivum\nvar. Bosporus"="darkgreen")

#Grafik

Grafik <- ggplot(Rohdaten,
       aes(x=Wuchshöhe, y=Stängeldurchmesser, col=Art))+
  geom_line()+
  geom_point(size=3)+
  xlab("Wuchshöhe [cm]")+
  ylab("Stängeldurchmesser [mm]")+
  geom_vline(xintercept = 35,linetype = 2)+
  geom_vline(xintercept = 65,linetype = 2)+
  scale_y_continuous(position = "right",limits = c(0,50), breaks = c(0, 10, 20, 30, 40, 50),labels = c("0","10","20","30","40","50"))+
  scale_x_continuous(breaks = c(10, 20, 30, 40, 50, 60, 70, 80, 90), labels = c("10","20","30","40","50","60","70","80","90"))+
  scale_color_manual(values = Farben_Arten)+
  theme(axis.text.x = element_text(size = 15, face="bold"))+
  theme(axis.text.y = element_text(size = 15, face="bold"))+
  theme(axis.title.x = element_text(size =17))+
  theme(axis.title.y = element_text(size = 17))+
  theme(legend.title = element_text(size = 14, face="bold"))+
  theme(legend.text = element_text(size = 14))+
  Thema_Beispiel+
  coord_flip()

#Tabelle

Tabelle <- ggplot(Statistik, aes(x=Blattetage, y=Art, label=groups))+
  geom_text()+
  scale_y_discrete(position = "right")+
  scale_color_manual(values = Farben_Arten)+
  theme(axis.text.x = element_text(size = 15, face = "bold"))+
  theme(axis.text.y = element_text(size = 15, face = "bold"))+
  theme(axis.title.x = element_text(size =17))+
  theme(axis.title.y = element_text(size = 17))+
  theme(legend.title = element_text(size = 14, face="bold"))+
  theme(legend.text = element_text(size = 14))+
  Thema_Beispiel+
  coord_flip()

#Gesamtdarstellung

ggarrange(Grafik, Tabelle)


Benutzeravatar
EDi
Beiträge: 887
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Automatischer Zeilenumbruch ggplot

Beitrag von EDi » Do Jun 27, 2019 10:18 pm

Achsenbeschriftung für die Tabelle den Zeilenumbruch auch macht. Da liegt nämlich das Kernproblem. Gibt es dafür noch eine Möglichkeit?
Sollte analog funktionieren.
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.

dvf
Beiträge: 19
Registriert: Mo Feb 27, 2017 12:44 pm

Re: Automatischer Zeilenumbruch ggplot

Beitrag von dvf » Fr Jun 28, 2019 3:09 pm

Einige Anregungen sind hier https://stackoverflow.com/questions/736 ... lot-titles zu finden.

Gruß
dvf

flip_0207
Beiträge: 11
Registriert: Do Dez 06, 2018 7:46 pm

Re: Automatischer Zeilenumbruch ggplot

Beitrag von flip_0207 » Do Jul 11, 2019 3:45 pm

Vielen Dank!

Leider bin ich mit meinem Problem noch nicht wirklich weiter gekommen. Das Beispiel von EDi funktioniert schon einmal für meine Beispieldaten, nicht aber für meine tatsächlichen Daten:

Code: Alles auswählen

library(tidyverse)
library(ggpubr)

#Vorbereitungen

Rohdaten <- read.csv2("Zeilenumbruch_Beispiel.csv")
Statistik <- read.csv2("Statistik.csv")

Statistik$Blattetage <- as.factor(Statistik$Blattetage)

Thema_Beispiel <- theme(panel.background = element_rect(fill = "white"),
                   axis.line = element_line())

Rohdaten <- Rohdaten %>%
  mutate(Art = gsub(" var", "\\\nvar", Art))
Farben_Arten <- c("Lupinus angustifolius\nvar. Azuro"="blue", "Triticum aestivum\nvar. Bosporus"="darkgreen")

Statistik <- Statistik %>%
  mutate(Art = gsub(" var", "\\\nvar", Art))
Farben_Arten <- c("Lupinus angustifolius\nvar. Azuro"="blue", "Triticum aestivum\nvar. Bosporus"="darkgreen")

#Grafik

Grafik <- ggplot(Rohdaten,
       aes(x=Wuchshöhe, y=Stängeldurchmesser, col=Art))+
  geom_line()+
  geom_point(size=3)+
  xlab("Wuchshöhe [cm]")+
  ylab("Stängeldurchmesser [mm]")+
  geom_vline(xintercept = 35,linetype = 2)+
  geom_vline(xintercept = 65,linetype = 2)+
  scale_y_continuous(position = "right",limits = c(0,50), breaks = c(0, 10, 20, 30, 40, 50),labels = c("0","10","20","30","40","50"))+
  scale_x_continuous(breaks = c(10, 20, 30, 40, 50, 60, 70, 80, 90), labels = c("10","20","30","40","50","60","70","80","90"))+
  scale_color_manual(values = Farben_Arten)+
  theme(axis.text.x = element_text(size = 15, face="bold"))+
  theme(axis.text.y = element_text(size = 15, face="bold"))+
  theme(axis.title.x = element_text(size =17))+
  theme(axis.title.y = element_text(size = 17))+
  theme(legend.title = element_text(size = 14, face="bold"))+
  theme(legend.text = element_text(size = 14))+
  Thema_Beispiel+
  coord_flip()

#Tabelle

Tabelle <- ggplot(Statistik, aes(x=Blattetage, y=Art, label=groups))+
  geom_text()+
  scale_y_discrete(position = "right")+
  scale_color_manual(values = Farben_Arten)+
  theme(axis.text.x = element_text(size = 15, face = "bold"))+
  theme(axis.text.y = element_text(size = 15, face = "bold"))+
  theme(axis.title.x = element_text(size =17))+
  theme(axis.title.y = element_text(size = 17))+
  theme(legend.title = element_text(size = 14, face="bold"))+
  theme(legend.text = element_text(size = 14))+
  Thema_Beispiel+
  coord_flip()

#Gesamtdarstellung

ggarrange(Grafik, Tabelle)

Für meinen deutlich umfangreicheren Datensatz ist das allerdings keine wirklich Option. Das liegt u.a. an der Tatsache, dass ich die Werte für die y-Achse nicht manuell benenne, sondern in der Grafik "Tabelle" eben folgende Textzeile nutze und auf der y-Achse die "Art" plotte:

Code: Alles auswählen

Tabelle <- ggplot(Statistik, aes(x=Blattetage, y=Art, label=groups))+
  geom_text()+
Genau da sollte der Zeilenumbruch nun auch rein. Da ich das manuell aber nicht für mittlerweile fast 40 Grafiken machen kann/möchte, suche ich noch eine alternative Lösung.

Danke für den Link dvf! Hier wird aber nur über plot title bzw. Achsentitel gesprochen. Für tatsächliche "Werte" (als character formatiert), die aus einem data frame rausgelesen werden aber noch nicht.

Hufeisen
Beiträge: 122
Registriert: Fr Aug 31, 2018 6:34 pm

Re: Automatischer Zeilenumbruch ggplot

Beitrag von Hufeisen » Fr Jul 12, 2019 9:01 am

Ich habe hier nur so mitgelesen und es sind fähigere Helfer als ich am Werk. Aber wie wäre es, die Achsenbeschriftung durch eine Funktion laufen zu lassen, die 1. die Länge jedes Elements bestimmt; 2. bei, sagen wir Länge > 30 Zeichen, von der Mitte des strings aus nach links und rechts das nächstgelegene Leerzeichen sucht und dort einen Zeilenumbruch einfügt. Ich schlage das erst mal nur so vor, weil ich für ein funktionierendes Beispiel selbst eine kleine Weile brauchen würde :o .

Antworten