Ribbon mit ggplot2

Wie erstelle ich Grafiken, was ist zu beachten?

Moderatoren: EDi, jogo

Antworten
bigben
Beiträge: 1321
Registriert: Mi Okt 12, 2016 9:09 am

Ribbon mit ggplot2

Beitrag von bigben »

Hallo Leute,

ich versuche mich mal wieder an ggplot2 und hoffe, dass ich was einfaches übersehe. Für eine bestimmte Messmethode sind Normwerte vom Gerätehersteller gegeben, und ich möchte zu folgenden Normwerten später Messwerte ergänzen:

Code: Alles auswählen

library(ggplot2)
library(ggthemes)
## 
ref <- cbind(y = seq(0,50,5),
                  read.table(header=TRUE, dec=",", 
                             text="low	MW	high
                                   -32,43	-4,98	10,25
                                   -10,80	11,25	25,10
                                   10,15	28,35	41,05
                                   29,98	45,13	56,65
                                   46,68	61,23	72,00
                                   59,25	74,08	84,90
                                   69,88	84,15	93,80
                                   78,03	91,45	100,55
                                   85,80	96,90	107,15
                                   92,98	102,28	115,88
                                   96,33	107,98	125,05"))

pl <- ggplot(ref) +
  geom_line(aes(x=low, y=y), color="grey") +
  geom_line(aes(x=high, y=y), color="grey") +
  geom_line(aes(x=MW, y=y), color="darkgrey", lwd = 1) +
  theme_bw()

print(pl)
Rplot.png
Rplot.png (3.57 KiB) 125 mal betrachtet
Wir sehen also einen Mittelwert und ein 95%-KI. Das würde sich anbieten, als grau hinterlegtes Band dargestellt zu werden, und wenn ich zu fixen x-Werten die passenden y-Werte hätte, könnte ich das ganz leicht mit ggplot2::geom_ribbon zeichnen. Der Gerätehersteller hat aber zu fixen y-Werten die x-Werte angegeben und das passt nach meinem bisherigen Verstehen nicht zur Syntax von geom_ribbon. Das braucht wohl zu jedem x-Wert 2 y-Werte. Ich könnte jetzt entweder ganz aufwändig die Werte interpolieren oder ich könnte mit coord_flip arbeiten. Das bringt zwar das erwünschte Ergebnis, ist aber hässlich, bei der eigentlichen Darstellung ständig x und y vertauschen zu müssen. Habe ich da was übersehen, oder ist ggplot2 so unflexibel?

Dazu: Ist Euch auch aufgefallen, dass die mittlere Linie nicht überall gleich breit ist? Was kann man da machen?

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

Benutzeravatar
student
Beiträge: 395
Registriert: Fr Okt 07, 2016 9:52 am

Re: Ribbon mit ggplot2

Beitrag von student »

Hallo Bernhard,

per se sieht die Grafik nicht schlecht aus und ich würde es wahrscheinlich auch so machen (nach dem Motto "Keep it simple". Aber die MW-Line ist mir natürlich auch aufgefallen und die Struktur scheint von dem Parameter lwd abzuhängen. Ich habe mal lwd = 0.5 / 2 / 3 ausprobiert und mit diesen Parameterwerten erscheint sie mir gleichmäßig durchgezogen. Muss also m. E. etwas ggplot-internes sein.
Viele Grüße,
Student
-----------------------------------------------------------------------------------------------------------------------
faes.de, Datenanalyse mit R & das Ad-Oculos-Projekt

Habe Mut, dich deines eigenen Verstandes zu bedienen! (Kant)

bigben
Beiträge: 1321
Registriert: Mi Okt 12, 2016 9:09 am

Re: Ribbon mit ggplot2

Beitrag von bigben »

Hallo Günter,

der Erstautor unserer Arbeit wollte die Bilder als PDF und da ist die Liniendarstellung kein Problem: Der Adobe Reader beherrscht das mit dem Antialiasing erwartungsgemäß besser als das PNG-Device von ggplot2. In der PDF-Ausgabe hatte ich anfangs Probleme mit einem Umlaut in der Achsenbeschriftung, aber das ließ sich lösen, indem man das Encoding des Sourcefiles von utf-8 auf ISO-8859-1 umstellt. Seither klappt es mit den Umlauten.

Zum geom_errorbar gibt es ja eine Schwesterfunktion geom_errorbarh, wenn die Daten in horizontaler Richtung laufen. geom-boxplot kann davon abweichend sowohl horizontale als auch vertikale Boxplots mit nur einem geom zeichnen.
Was mein Problem angeht, so sehe ich gerade, dass geom_ribbon in ggplot2 in Version 3.3.0 ein Argument orientation hat. Auf meinem Rechner läuft aber noch ggplot 3.2.1. Vielleicht lässt sich mein Kernproblem also mit einem ggplot2-Update beheben. Ich melde mich nochmal.

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

bigben
Beiträge: 1321
Registriert: Mi Okt 12, 2016 9:09 am

Re: Ribbon mit ggplot2

Beitrag von bigben »

Heureka! Mein zu erwartender feature request nach einem "horizontalen ribbon" wurde mit der Anfang diesen Monats erschienenen Version 3.3.0 von ggplot2 bereits vorauseilend umgesetzt. Es gibt ein Argument orientation, das dann auch zu einer Umbenennung der Argumente ymin zu xmin und von ymax zu xmax führt. Jetzt sieht die Grafik etwa so aus:
erfolg.png
Über die Farbwahl wird man nochmal nachdenken, aber dann ist das publikationsreif.

Falls das mal jemand nachkochen möchte, lasse ich den Code dazu da:

Code: Alles auswählen

library(ggplot2)

referenz <- structure(list(y = c(0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50), 
              low = c(-32.4, -10.2, 10.3, 28.6, 44.8, 56.6, 67.5, 77, 88.2, 97.6, 100.1), 
              MW = c(-6, 10, 26.8, 43.1, 59.3, 72.3, 82.9, 91.9, 98.6, 104.9, 112.5), 
              high = c(7.4, 22.5, 39.3, 56.1, 72.2, 85.4, 95.5, 102.6, 113.2, 125.8, 139.2)),
             class = "data.frame", row.names = c(NA, -11L))

daten <- structure(list(y  = c(0, 5, 15, 25), 
                        mw = c(51.4868421052632, 60.9057894736842, 79.741052631579, 95.976), 
                        sigma = c(5.5339287356689, 4.48567759750653, 5.60353052869036, 8.33117364395403), 
                        se = c(1.26957032208087, 1.0290850179387, 1.2855380685056, 2.15109978515974)), class = "data.frame", 
                        row.names = c("a", "b", "c", "d"))


fig1 <- ggplot(ref) +
  geom_ribbon(aes(xmin=low, xmax=high, y=y), orientation="y", fill="pink", alpha=.3) +
  geom_line(aes(x=low, y=y), color="grey", lwd=.5) +
  geom_line(aes(x=high, y=y), color="grey", lwd=.5) +
  geom_line(aes(x=MW, y=y), color="darkgrey", lwd = 1.2) +
  xlab("das ist die x-Achse") +
  ylab("das ist die y-achse") +
  geom_point(data = daten, aes(x=mw, y=y), size=3) +
  geom_errorbarh(data = daten, aes(y=y, xmin=mw-2*sigma, xmax=mw+2*sigma), height=1) +
  geom_line(data = daten, aes(x=mw, y=y), lwd=1) +
  annotate(geom="text", x=0, y=45, label="ab ggplot 3.3 mit \ngeom_ribbon", hjust="left",
           color="grey", size = 10) +
  coord_cartesian(xlim = c(0,100), ylim = c(0,50))

print(fig1)
ggsave("erfolg.png", width=10, height = 10, units="cm")
GLG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte

Benutzeravatar
student
Beiträge: 395
Registriert: Fr Okt 07, 2016 9:52 am

Re: Ribbon mit ggplot2

Beitrag von student »

Sieht gut aus! :)
Viele Grüße,
Student
-----------------------------------------------------------------------------------------------------------------------
faes.de, Datenanalyse mit R & das Ad-Oculos-Projekt

Habe Mut, dich deines eigenen Verstandes zu bedienen! (Kant)

Antworten