Seite 1 von 1

Automatischer Zeilenumbruch ggplot

Verfasst: Fr Jun 21, 2019 12:02 pm
von flip_0207
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()

Re: Automatischer Zeilenumbruch ggplot

Verfasst: Fr Jun 21, 2019 11:42 pm
von EDi
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

Re: Automatischer Zeilenumbruch ggplot

Verfasst: Mo Jun 24, 2019 4:50 pm
von dvf
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

Re: Automatischer Zeilenumbruch ggplot

Verfasst: Mo Jun 24, 2019 9:05 pm
von flip_0207
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)


Re: Automatischer Zeilenumbruch ggplot

Verfasst: Di Jun 25, 2019 10:38 pm
von EDi
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")

Re: Automatischer Zeilenumbruch ggplot

Verfasst: Do Jun 27, 2019 6:46 pm
von flip_0207
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)


Re: Automatischer Zeilenumbruch ggplot

Verfasst: Do Jun 27, 2019 10:18 pm
von EDi
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.

Re: Automatischer Zeilenumbruch ggplot

Verfasst: Fr Jun 28, 2019 3:09 pm
von dvf
Einige Anregungen sind hier https://stackoverflow.com/questions/736 ... lot-titles zu finden.

Gruß
dvf

Re: Automatischer Zeilenumbruch ggplot

Verfasst: Do Jul 11, 2019 3:45 pm
von flip_0207
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.

Re: Automatischer Zeilenumbruch ggplot

Verfasst: Fr Jul 12, 2019 9:01 am
von Hufeisen
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 .