Mehrere ggplot Grafiken mit facet_wrap?

Wie erstelle ich Grafiken, was ist zu beachten?

Moderatoren: EDi, jogo

Antworten
Werekorden
Beiträge: 83
Registriert: So Feb 04, 2018 7:52 pm

Mehrere ggplot Grafiken mit facet_wrap?

Beitrag von Werekorden »

Hi,

und schon wieder habe ich eine Frage: Ich habe ja dank Bernhard so einiges für meine Proben-Haltbarkeitsauswertung hinbekommen. Jetzt will ich aber die Ergebnisse nicht nur Tabellarisch sondern auch grafisch zeigen. Es sollen für 15 Proben die Werte über den zeitlichen Verlauf von einem Jahr gezeigt werden um zu zeigen, dass die Proben eine gute Haltbarkeit haben.

Dabei soll sowohl die lineare Regression angezeigt werden als auch die 95% CIs um zu zeigen, ob einzelne Messtage herausstechen. Im Beispiel z.B. an Tag 286 sind die Werte für H1 sehr niedrig.

Ich habe mit Hilfe des Internets den zweiten Plot mit facet_wrap usw. erstellt. Er zeigt mir aber nicht die wahren Cq-Werte für jede Probe an (alle sind gleich) und auch wird die y-Achse nicht beschriftet, was höchstwahrscheinlich zusammenhängt.

Darf ich Unwürdiger ;) euch um ein wenig Hilfe bitten?

Code: Alles auswählen

library(ggplot2)
library(dplyr)
library(tidyr)

sample1 <- read.table(header = TRUE, dec = ",", text = 
                        "Day	H1	H2	H3	H4	M1	M2	M3	M4	L1	L2	L3	L4	PK1	PK2	PK3
0	25,9874	26,01875	25,95655	25,95165	29,2727	29,4116	29,2389	29,30505	32,76275	32,69395	32,6963	32,80915	23,64346667	26,9035	30,64406667
57	25,70225	25,7461	25,77375	25,76555	29,13705	29,13665	29,2091	29,0638	32,58625	32,8572	32,59715	32,20532	24,14003333	29,41563333	31,2637
98	25,70600573	25,72381592	25,70797857	25,71254603	28,98645592	29,21009572	29,09545708	29,18635877	32,64453761	32,70707448	32,39242554	32,69418971	25,33333333	30,01	34,20666667
189	25,73180667	25,63853333	25,68836	25,64337333	29,04110333	28,84034667	29,07556667	29,01635667	32,66040667	32,36568333	32,64399333	32,49889	22,86015	26,80275	30,504258
286	24,43987783	24,59473801	24,50444539	24,55189578	26,89529673	26,92798169	26,99993324	26,85812505	30,19608625	30,45819219	30,45007133	30,36466662	23,07262484	26,24733263	30,80879011
380	25,73180667	25,63853333	25,68836	25,64337333	29,04110333	28,84034667	29,07556667	29,01635667	32,66040667	32,36568333	32,64399333	32,49889	22,86015	26,80275	30,504258
")




plot<- ggplot(sample1, aes(x = Day, y = H1)) +
  labs(title    = 'Regressions Plot Shelf life',
       subtitle = 'Polynomial regression Plot to test shelf life of high titer Sample H1',
       x        = 'Days',
       y        = expression (C[q] -value),
       caption  = ' Andreas  / Andreas@Andreas.com') +
  #geom_line(data = neue.punkte, mapping = aes(x=x, y=y.fit1), color="purple") +
  #geom_line(data = neue.punkte, mapping = aes(x=x, y=y.fit2), color ="red") +
  #geom_line(data = neue.punkte, mapping = aes(x=x, y=y.fit3), color="blue") +
  geom_point(aes(x=Day, y=H1)) +
  geom_smooth(method="lm", level = 0.90, color = 3, fullrange = FALSE) 
  #geom_text(data=Texte, aes(x=0.1, y=26.5 - 1.2*lnr, label=(Equation), colour=Reihe), parse=TRUE, hjust="left", 
  #          show.legend=FALSE)
  #theme_bw()
plot


#Versuch für jede Probe in einer Tabelle einen Plot zu erstellen
sample1 <- as_tibble(sample1)
sample1 %>%
  pivot_longer(cols = 2:16, names_to = "Proben", values_to = "Cq") %>%
  ggplot(aes(x = Day)) +
  geom_point(aes(x=Day, y="Proben"), color = "red") +
  facet_wrap(vars(Proben), ncol = 4) +
  labs(x = "Tage Haltbarkeit", y = "Cq-Werte")
Wie immer vielen Dank für eure Hilfe.
VG
Andreas
Zuletzt geändert von Werekorden am Do Aug 12, 2021 3:21 pm, insgesamt 1-mal geändert.
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Mehrere ggplot Grafiken mit facet_wrap?

Beitrag von bigben »

Hallo Andreas,
Werekorden hat geschrieben: Do Aug 12, 2021 2:50 pmDarf ich Unwürdiger ;) euch um ein wenig Hilfe bitten?
Unwürdig ist nur, wer bis zu seinem 67. Post in diesem Forum noch nicht mitbekommen hat, dass zu so einer Frage ein reproduzierbares Minimalbeispiel einschl. angemessen aufbereiteter Beispieldaten zum Spielen und Vormachen gehört. Da Du erst 66 mal gepostet hast, kannst Du per Definition da gar nicht zu gehören ;) :lol:
Dabei soll sowohl die lineare Regression angezeigt werden als auch die 95% CIs um zu zeigen, ob einzelne Messtage herausstechen.
Du meinst aber schon ein 95%-Konfidenzintervall für die Regressiongerade wie geom_smooth es zeichnet?

Bis die Beispieldaten vorliegen, hier schon mal ein lesenswerter Blog: http://zevross.com/blog/2019/04/02/easy ... m-ggplot2/

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Werekorden
Beiträge: 83
Registriert: So Feb 04, 2018 7:52 pm

Re: Mehrere ggplot Grafiken mit facet_wrap?

Beitrag von Werekorden »

:? UI nur noch ein Post. Jetzt keinen Fehler machen.

Mist hatte das falsche Fenster kopiert ohne die Tabelle mit reinzunehmen. So, die Daten sind jetzt im ersten Post im Code eingefügt.

Ja klar meinte ich das 95% Konfidenzintervall der Regressionsgeraden, sorry vergessen zu sagen.

VG,
Andreas
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Mehrere ggplot Grafiken mit facet_wrap?

Beitrag von bigben »

Hallo Andreas,
Werekorden hat geschrieben: Do Aug 12, 2021 3:22 pm:? UI nur noch ein Post. Jetzt keinen Fehler machen.
Jep. Jetzt ist der Welpenschutz 'rum und wir erwarten, dass das sitzt :D

Ansonsten hast Du einen ganz schlichten Tippfehler gemacht. Schau mal, was Du in Deinem geom_point()-Aufruf der y-Achse zugewiesen hast.

Der wahrscheinlich richtige Code sieht jetzt so aus:

Code: Alles auswählen

library(ggplot2)
library(dplyr)
library(tidyr)

sample1 <- read.table(header = TRUE, dec = ",", text = 
                        "Day	H1	H2	H3	H4	M1	M2	M3	M4	L1	L2	L3	L4	PK1	PK2	PK3
0	25,9874	26,01875	25,95655	25,95165	29,2727	29,4116	29,2389	29,30505	32,76275	32,69395	32,6963	32,80915	23,64346667	26,9035	30,64406667
57	25,70225	25,7461	25,77375	25,76555	29,13705	29,13665	29,2091	29,0638	32,58625	32,8572	32,59715	32,20532	24,14003333	29,41563333	31,2637
98	25,70600573	25,72381592	25,70797857	25,71254603	28,98645592	29,21009572	29,09545708	29,18635877	32,64453761	32,70707448	32,39242554	32,69418971	25,33333333	30,01	34,20666667
189	25,73180667	25,63853333	25,68836	25,64337333	29,04110333	28,84034667	29,07556667	29,01635667	32,66040667	32,36568333	32,64399333	32,49889	22,86015	26,80275	30,504258
286	24,43987783	24,59473801	24,50444539	24,55189578	26,89529673	26,92798169	26,99993324	26,85812505	30,19608625	30,45819219	30,45007133	30,36466662	23,07262484	26,24733263	30,80879011
380	25,73180667	25,63853333	25,68836	25,64337333	29,04110333	28,84034667	29,07556667	29,01635667	32,66040667	32,36568333	32,64399333	32,49889	22,86015	26,80275	30,504258
")


# Für jede Probe in einer Tabelle einen Plot zu erstellen
sample1 %>%
  pivot_longer(cols = 2:16, names_to = "Proben", values_to = "Cq") %>%
  ggplot() +
  geom_point(aes(x=Day, y=Cq), color = "red") +
  geom_smooth(aes(x=Day, y=Cq), method = "lm") +
  facet_wrap(vars(Proben), ncol = 4) +
  labs(x = "Tage Haltbarkeit", y = "Cq-Werte")

Ja klar meinte ich das 95% Konfidenzintervall der Regressionsgeraden, sorry vergessen zu sagen.


Du hattest es ja implizit in Deinem Code gesagt. Ich wollte nur nochmal ein Nachdenken anstoßen, dass Du Deine Datenpunkte hier nicht mit einem 95%-CI der Datenpunkte, sondern der Regressionsgeraden vergleichst. Das kannst Du gerne machen, wenn Du es visuell hilfreich findest, ein wenig ist es aber wie Äpfel mit Birnen vergleichen.

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Werekorden
Beiträge: 83
Registriert: So Feb 04, 2018 7:52 pm

Re: Mehrere ggplot Grafiken mit facet_wrap?

Beitrag von Werekorden »

Hi,

ach Mensch, so blind kann man sein. Danke!

Tja, das mit dem Vergleichen von Regressionsmodell-CIs und echten Messwerten-CIs liegt daran, dass wir zeigen sollen, dass unsere Proben, die für den diagnostischen Einsatz gedacht sind, den Bestimmungen der CLSI folgen.

Ich persönlich denke mir gerade, evtl. sollet ich beide CIs angeben, die der eigentlichen Werte und die CIs des Regressionsmodels? Die kann man doch bestimmt überlagernd in die Grafik einfügen oder?

Hier mal der Ausschnitt eines Beispiels aus dem CLSI-Dokument:
The result of this approach can be compared to the shelf-life estimate that is calculated directly from the regression equation. Using the same 5% allowable drift criterion, the maximum allowable drift is 1947.8 µg/L – 1855.0 µg/L = 92.8 µg/L. Dividing that value by the regression slope of 0.2011 (from the table above) gives a stability duration of 461 days. Basing stability estimates on the 95% confidence interval clearly gives more conservative results that help to minimize risk.
VG,
Andreas
Werekorden
Beiträge: 83
Registriert: So Feb 04, 2018 7:52 pm

Re: Mehrere ggplot Grafiken mit facet_wrap?

Beitrag von Werekorden »

So, habe gesehen, dass soviel Plots auf einer Seite blöd sind. Da kann man die CIs gar nicht gut sehen vor allem ob ein Messwert rausfällt.

Habe versucht die Grafik für rmarkdown auf mehrere Seiten aufzuteilen und eine Info zum Paket ggforce gefunden, bzw. habe es mittels Chunk optionen versucht.

Es will aber nicht recht klappen:
  • Irgendwie ist beim Originial-Plot die Reihenfolge verdreht worden. Es kommt erst die Plots von H1-4 dann die von L1-4 obwohl eigentlich M1-4 kommen sollte.
  • Beim Plot über mehrere Seiten wird nur H1-4 ausgeworfen

Hier der Code:

Code: Alles auswählen

library(ggplot2)
library(dplyr)
library(tidyr)
library(ggforce)

sample1 <- read.table(header = TRUE, dec = ",", text = 
                        "Day	H1	H2	H3	H4	M1	M2	M3	M4	L1	L2	L3	L4	PK1	PK2	PK3
0	25,9874	26,01875	25,95655	25,95165	29,2727	29,4116	29,2389	29,30505	32,76275	32,69395	32,6963	32,80915	23,64346667	26,9035	30,64406667
57	25,70225	25,7461	25,77375	25,76555	29,13705	29,13665	29,2091	29,0638	32,58625	32,8572	32,59715	32,20532	24,14003333	29,41563333	31,2637
98	25,70600573	25,72381592	25,70797857	25,71254603	28,98645592	29,21009572	29,09545708	29,18635877	32,64453761	32,70707448	32,39242554	32,69418971	25,33333333	30,01	34,20666667
189	25,73180667	25,63853333	25,68836	25,64337333	29,04110333	28,84034667	29,07556667	29,01635667	32,66040667	32,36568333	32,64399333	32,49889	22,86015	26,80275	30,504258
286	24,43987783	24,59473801	24,50444539	24,55189578	26,89529673	26,92798169	26,99993324	26,85812505	30,19608625	30,45819219	30,45007133	30,36466662	23,07262484	26,24733263	30,80879011
380	25,73180667	25,63853333	25,68836	25,64337333	29,04110333	28,84034667	29,07556667	29,01635667	32,66040667	32,36568333	32,64399333	32,49889	22,86015	26,80275	30,504258
")

#Ursprüngliche Grafik
sample1 %>%
  pivot_longer(cols = 2:16, names_to = "Proben", values_to = "Cq") %>%
  ggplot() +
  geom_point(aes(x=Day, y=Cq), color = "red") +
  geom_smooth(aes(x=Day, y=Cq), method = "lm") +
  facet_wrap(vars(Proben), ncol = 4) +
  labs(x = "Tage Haltbarkeit", y = "Cq-Werte")


#mehrseitengrafik
sample1 %>%
  pivot_longer(cols = 2:16, names_to = "Proben", values_to = "Cq") %>%
  ggplot() +
  geom_point(aes(x=Day, y=Cq), color = "red") +
  geom_smooth(aes(x=Day, y=Cq), method = "lm") +
  labs(x = "Tage Haltbarkeit", y = "Cq-Werte") +
  facet_wrap_paginate(~Proben,
                      nrow = 4, 
                      ncol = 1, 
                      scales = "free") +
  theme( strip.text = element_text(size = 30)) -> p

required_n_pages <- n_pages(p)



for(i in 1:required_n_pages){
  
  sample1 %>%
    pivot_longer(cols = 2:16, names_to = "Proben", values_to = "Cq") %>%
    ggplot() +
    geom_point(aes(x=Day, y=Cq), color = "red") +
    geom_smooth(aes(x=Day, y=Cq), method = "lm") +
    labs(x = "Tage Haltbarkeit", y = "Cq-Werte") +
    facet_wrap_paginate(~Proben,
                        nrow = 4, 
                        ncol = 1, 
                        scales = "free") +
    theme( strip.text = element_text(size = 30)) -> p
}  
  print(p)
Ich würde die Mehrseitenplot Aufteilung auch gerne mit ggplot selbst machen, finde aber keine Lösung, deshalb habe ich ggforce ausprobiert.

VG,
Andreas
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Mehrere ggplot Grafiken mit facet_wrap?

Beitrag von EDi »

werden als auch die 95% CIs um zu zeigen, ob einzelne Messtage herausstechen.
Würde sich für solch ein Fragestellung nicht eher ein Prediction-Intervall anbieten?
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.
Werekorden
Beiträge: 83
Registriert: So Feb 04, 2018 7:52 pm

Re: Mehrere ggplot Grafiken mit facet_wrap?

Beitrag von Werekorden »

Hallo EDI,

Ich habe das aus dem Text anders gelesen aber es kann natürlich sein.

Aber die folgende Formel aus der CLSI geht von den eigentlichen Messwerten und den entsprechenden CIs aus:

Ich bin jetzt nicht so gut in Statistik. Gibt es da Infos welche CIs konservativer sind, die basierend auf den echten Messwerten oder Prediction-Intervalls, die basierend auf dem linearen Modell?


VG,
Andreas
Dateianhänge
Bildschirmfoto 2021-08-14 um 22.54.09.png
Zuletzt geändert von Werekorden am Fr Aug 20, 2021 9:13 am, insgesamt 1-mal geändert.
Werekorden
Beiträge: 83
Registriert: So Feb 04, 2018 7:52 pm

Re: Mehrere ggplot Grafiken mit facet_wrap?

Beitrag von Werekorden »

Edited!

Asche auf mein Haupt hab die Funktions-Klammer falsch gesetzt. So ist es jetzt fast richtig.

Leider verstehe ich noch nicht warum es eine falsche Reihenfolge der Plots gibt. Es sollte eigentlich mit H1 – H4 anfangen und dann M1 – M4, L1 – L4 und zum Schluss PK1 – PK3.

Hier der Code für markdown:

Code: Alles auswählen

---
output:
  pdf_document:
    fig_caption: yes
    latex_engine: xelatex
---


```{r , echo=FALSE, message=FALSE, warning=FALSE, comment=FALSE,results='hide'} 
library(tidyverse)
library(dplyr)
library(scales)
library(ggplot2)
library(ggforce)
```

```{r}
sample1 <- read.table(header = TRUE, dec = ",", text = 
                        "Day	H1	H2	H3	H4	M1	M2	M3	M4	L1	L2	L3	L4	PK1	PK2	PK3
0	25,9874	26,01875	25,95655	25,95165	29,2727	29,4116	29,2389	29,30505	32,76275	32,69395	32,6963	32,80915	23,64346667	26,9035	30,64406667
57	25,70225	25,7461	25,77375	25,76555	29,13705	29,13665	29,2091	29,0638	32,58625	32,8572	32,59715	32,20532	24,14003333	29,41563333	31,2637
98	25,70600573	25,72381592	25,70797857	25,71254603	28,98645592	29,21009572	29,09545708	29,18635877	32,64453761	32,70707448	32,39242554	32,69418971	25,33333333	30,01	34,20666667
189	25,73180667	25,63853333	25,68836	25,64337333	29,04110333	28,84034667	29,07556667	29,01635667	32,66040667	32,36568333	32,64399333	32,49889	22,86015	26,80275	30,504258
286	24,43987783	24,59473801	24,50444539	24,55189578	26,89529673	26,92798169	26,99993324	26,85812505	30,19608625	30,45819219	30,45007133	30,36466662	23,07262484	26,24733263	30,80879011
380	25,73180667	25,63853333	25,68836	25,64337333	29,04110333	28,84034667	29,07556667	29,01635667	32,66040667	32,36568333	32,64399333	32,49889	22,86015	26,80275	30,504258
")

#mehrseitengrafik von Homepage https://www.programmingwithr.com/how-to-make-your-facet-wrap-facet-grid-ggplots-span-across-multiple-pages-in-pdf/
testplot <- sample1 %>%
  pivot_longer(cols = 2:16, names_to = "Proben", values_to = "Cq")


  ggplot(testplot) +
  geom_point(aes(x=Day, y=Cq), color = "red") +
  geom_smooth(aes(x=Day, y=Cq), method = "lm") +
  labs(x = "Tage Haltbarkeit", y = "Cq-Werte") +
  facet_wrap_paginate(~Proben,
                      nrow = 4, 
                      ncol = 1, 
                      scales = "free") +
  theme( strip.text = element_text(size = 30)) -> p

required_n_pages <- n_pages(p)



for(i in 1:required_n_pages){
  
    ggplot(testplot) +
    geom_point(aes(x=Day, y=Cq), color = "red") +
    geom_smooth(aes(x=Day, y=Cq), method = "lm") +
    labs(x = "Tage Haltbarkeit", y = "Cq-Werte") +
    facet_wrap_paginate(~Proben,
                        nrow = 4, 
                        ncol = 1, 
                        scales = "free",
                        page = i) +
    theme( strip.text = element_text(size = 30)) -> p
      print(p)
}  

Ich hoffe, ich habe mich eindeutig genug ausgedrückt.

VG,
Andreas
Antworten