size und color_continuous in ggplot2

Wie erstelle ich Grafiken, was ist zu beachten?

Moderatoren: EDi, jogo

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

size und color_continuous in ggplot2

Beitrag von bigben »

Hallo,

ich habe in einem tatsächlichen Forschungsprojekt zwei metrische Einflussvariablen und eine metrische Abhängige. Hier Beispieldaten (Teilmenge echter Forschungsdaten) und ein erster Plot:

Code: Alles auswählen

b <- structure(list(x = c(80, 16.25, 18.75, 28.75, 100, 25, 67.5, 
        36.25, 52.5, 55, 71.25, 57.5, 37.5, 47.5, 77.5, 47.5, 48.75, 
        118.75, 58.75, 10), y = c(72.5, 10, 10, 23.75, 43.75, 23.75, 
        10, 15, 41.25, 45, 16.25, 17.5, 33.75, 8.75, 16.25, 26.25, 10, 
        16.25, 5, 8.75), z = c(2.6, 18, 41, 41, 16, 48, 13, 38, 35, 21, 
        11, 17, 28, 37, 32, 12, 11, 31, 25, 28.7)), na.action = structure(c(`33` = 33L, 
        `38` = 38L, `45` = 45L, `62` = 62L, `64` = 64L, `66` = 66L, `69` = 69L, 
        `80` = 80L), class = "omit"), row.names = c(23L, 26L, 50L, 60L, 
        51L, 54L, 44L, 40L, 59L, 68L, 70L, 72L, 46L, 15L, 78L, 61L, 24L, 
        22L, 75L, 2L), class = "data.frame")
str(b)

library(ggplot2)
ggplot(b, aes(x = x, y = y, col = z, size = z)) +
  geom_point(alpha = .7) +
  coord_fixed() +
  theme_bw()
Rplot.png
Die dritte Dimension ist immer schwer zu erkennen und so dachte ich, es wäre eine gute Idee, sie sowohl auf die Farbe als auch die size zu mappen. Dabei finde ich es störend, dass ggplot2 zwei Legenden zeichnet, die die gleiche Messgröße ("z") darstellen. Kann man das irgendwie "einfach" zusammenführen in einer Legende mit verschiedengroßen Punkten in entsprechender Farbe?

Zusatzfrage: Hat jemand Erfahrung, welche kontinuierliche Farbpalette Punkte auf weißem Grund in einen größeren Farbbereich verdeutlicht? In der Originalarbeit werde ich nicht zwanzig sondern vielleicht hundert Punkte haben. Es wird zu nennenswertem Overplotting kommen weshalb ich ein alpha deutlich kleiner als 1 brauchen werde und wie oben erkennbar, ist der "visuelle Abstand" zwischen halbdurchsichtig-schwarz und halbdurchsichtig-blau nicht so besonders groß.

Zuletzt noch: Hat jemand Erfahrung, welches Paket für 3D-Darstellung gute Diagramme macht, die einen wirklich räumlichen Eindruck hinterlassen? Mit rgl komme ich nicht so gut zurecht: Das ist toll, wenn man die Maus in der Hand hat und die Punktwolke drehen kann, aber ohne mich tief darin zu vergraben waren die Standbilder nicht so räumlich. Rayshader gibt einen sehr guten Eindruck von der räumlichen Verteilung, wirkt aber komisch verzerrt, wie bei einer Parallelprojektion, sodass die hintere Kante eines Rechtecks länger wirkt als die vordere:
Rplot2.png
Das wäre mir auch zu verspielt. Sowas kann man in einem Vortrag mal bringen, aber seriös genug, um es einem Journal anzubieten? Eher nicht.

Viele Grüße,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Benutzeravatar
student
Beiträge: 675
Registriert: Fr Okt 07, 2016 9:52 am

Re: size und color_continuous in ggplot2

Beitrag von student »

Hallo Bernhard,

ich bin wohl der klassische Plot-Basisfunktionen-Nutzer und kein ggplot2-Experte, aber mir ist folgendes eingefallen:

Code: Alles auswählen

ggplot(b, aes(x = x, y = y, col = z, size = z)) +
  geom_point(alpha = .7) +
  coord_fixed() +
  theme_bw() +
  guides(colour = guide_legend(nrow = 2, byrow = T, override.aes=list(size=4))) +
  guides(size = guide_legend(nrow = 2, byrow = T))
Das liefert die beigefügte Grafik. Vielleicht hilft es weiter....
Dateianhänge
z-Plot.png
z-Plot.png (7.02 KiB) 1500 mal betrachtet
Viele Grüße,
Student
-----------------------------------------------------------------------------------------------------------------------
faes.de, Datenanalyse mit R & das Ad-Oculos-Projekt
Das Ad-Oculos-Projekt auf YouTube

Habe Mut, dich deines eigenen Verstandes zu bedienen! (Kant)
bigben
Beiträge: 2781
Registriert: Mi Okt 12, 2016 9:09 am

Re: size und color_continuous in ggplot2

Beitrag von bigben »

Hallo Günter,

danke für die Antwort. Die Größe aus der Legende ganz heraus zu nehmen mag ich nicht wirklich - dann ist der Plot nicht mehr selbsterklärend und das ist mir wichtiger als das Vermeiden von Redundanz.

Im Bereich der base-Grafiken gibt es nicht viel Angebot für 3D-Datensätze, oder?

Frohes Neues Jahr,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Benutzeravatar
student
Beiträge: 675
Registriert: Fr Okt 07, 2016 9:52 am

Re: size und color_continuous in ggplot2

Beitrag von student »

Es hat alles Vor- und Nachteile. Mit guides habe ich fast keine Erfahrung, aber möglicherweise gibt es noch Parameter mit deren Hilfe Du deiner Wunschgrafik näher kommst.

3D-Darstellung sind immer ein bisschen schwierig und vieles konnte ich mit plot3d realisieren. Soweit ich mich in Deine Anforderungen reindenken kann, ist das aber wohl nichts für Dich... :?
Viele Grüße,
Student
-----------------------------------------------------------------------------------------------------------------------
faes.de, Datenanalyse mit R & das Ad-Oculos-Projekt
Das Ad-Oculos-Projekt auf YouTube

Habe Mut, dich deines eigenen Verstandes zu bedienen! (Kant)
bigben
Beiträge: 2781
Registriert: Mi Okt 12, 2016 9:09 am

Re: size und color_continuous in ggplot2

Beitrag von bigben »

Hallo Günter,

frag nicht wie, aber mit Deinem Post im Kopf habe ich neu nach einer passenden base-Lösung gesucht und sowohl im Paket plot3D als auch im Paket scatterplot3d die Option

Code: Alles auswählen

type = "h"
gefunden. Bei scatterplot3d kommt das hier heraus:

Code: Alles auswählen

b <- structure(list(x = c(80, 16.25, 18.75, 28.75, 100, 25, 67.5, 
        36.25, 52.5, 55, 71.25, 57.5, 37.5, 47.5, 77.5, 47.5, 48.75, 
        118.75, 58.75, 10), y = c(72.5, 10, 10, 23.75, 43.75, 23.75, 
        10, 15, 41.25, 45, 16.25, 17.5, 33.75, 8.75, 16.25, 26.25, 10, 
        16.25, 5, 8.75), z = c(2.6, 18, 41, 41, 16, 48, 13, 38, 35, 21, 
        11, 17, 28, 37, 32, 12, 11, 31, 25, 28.7)), na.action = structure(c(`33` = 33L, 
        `38` = 38L, `45` = 45L, `62` = 62L, `64` = 64L, `66` = 66L, `69` = 69L, 
        `80` = 80L), class = "omit"), row.names = c(23L, 26L, 50L, 60L, 
         51L, 54L, 44L, 40L, 59L, 68L, 70L, 72L, 46L, 15L, 78L, 61L, 24L, 
         22L, 75L, 2L), class = "data.frame")

library(scatterplot3d)

p3d <- scatterplot3d(b[,1:3], type="h", lwd = 2.5, pch = 16,
              angle = 35, scale.y = .5, box = FALSE,
              main = "scatterplot3d::scatterplot3d(..., type = \"h\")")

p3d <- p3d$points3d(b$x, b$y, b$z, col = "blue", pch = 16)
Macht sowas hier:
Rplot01.png
Das ist insofern brauchbar, als jeder Punkt auch ohne Bewegung einen eindeutigen Platz im Raum einnimmt und ich erkennen kann, dass zunehmendes x und zunehmendes y zu abnehmendem z führen. Dazu gibt es noch eine nette Convenience-Funktion, um eine einfache Regressionsebene einzuzeichnen:

Code: Alles auswählen

p3d <- scatterplot3d(b[,1:3], type="h", lwd = 2, pch = 16,
              angle = 35, scale.y = .8, box = TRUE,
              main = "scatterplot3d::scatterplot3d(..., type = \"h\")",
              ylim = c(0,120))
              
p3d$plane3d(lm(z ~ x + y, data = b))
führt zu:
Rplot.png
In scatterplot3d ist gesetzt, dass die x-Achse waagerecht geplottet wird und auch das ist natürlich Parallelperspektive. Und genau das ist der Kernunterschied zum von Dir angesprochenen Paket plot3D, in dem man eine echte Fluchtpunktperspektive hat.

Mein persönlicher Lerninhalt:
1. Wähle plot3D, wenn Du Fluchtpunktperspektive und damit einen räumlicheren Eindruck haben möchtest, wähle scatterplot3d, wenn Du versuchen willst, Werte abzulesen.
2. Beides braucht type = "h" um die Höhe eines Punktes als Balken zu visualisieren.
3. Syntaktisch sind beide komisch, aber vor allem muss man darauf achten, wann 3D mit großem "D" und wann 3d mit kleinem "d" geschrieben wird.

Ich bastel noch einen zum Thread passenden Plot in plot3D für den nächsten Post.
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
bigben
Beiträge: 2781
Registriert: Mi Okt 12, 2016 9:09 am

Re: size und color_continuous in ggplot2

Beitrag von bigben »

Mit plot3D, wie von Günter vorgeschlagen, kann man beispielsweise in einem 45°-Winkel auf die Grafik schauen, und so die Prädiktoren x und y gleichwertig darstellen:

Code: Alles auswählen

b <- structure(list(x = c(80, 16.25, 18.75, 28.75, 100, 25, 67.5, 
        36.25, 52.5, 55, 71.25, 57.5, 37.5, 47.5, 77.5, 47.5, 48.75, 
        118.75, 58.75, 10), y = c(72.5, 10, 10, 23.75, 43.75, 23.75, 
        10, 15, 41.25, 45, 16.25, 17.5, 33.75, 8.75, 16.25, 26.25, 10, 
        16.25, 5, 8.75), z = c(2.6, 18, 41, 41, 16, 48, 13, 38, 35, 21, 
        11, 17, 28, 37, 32, 12, 11, 31, 25, 28.7)), na.action = structure(c(`33` = 33L, 
        `38` = 38L, `45` = 45L, `62` = 62L, `64` = 64L, `66` = 66L, `69` = 69L, 
        `80` = 80L), class = "omit"), row.names = c(23L, 26L, 50L, 60L, 
         51L, 54L, 44L, 40L, 59L, 68L, 70L, 72L, 46L, 15L, 78L, 61L, 24L, 
         22L, 75L, 2L), class = "data.frame")


library(plot3D)
plot3D::scatter3D(x = b$x, y = b$y, z = b$z, type = "h", col = "black",
                  pch = 16, bty = "b2", phi = 20, theta = 45,
                  ticktype = "detailed", 
                  xlim = c(0,120), ylim = c(0,120), zlim = c(0, 50),
                  main = "plot3D::scatter3D")
Rplot02.png
Und woe ich das jetzt in meiner Arbeit mache, muss ich noch ausprobieren.
Der base-Teil meiner Frage wäre damit beantwortet.

Wenn noch jemand eine Antwort hat, wie man in ggplot2 die size- und die color-Legende zu einer zusammenfassen kann, würde ich das gerne noch lernen.

Viele Grüße,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Benutzeravatar
student
Beiträge: 675
Registriert: Fr Okt 07, 2016 9:52 am

Re: size und color_continuous in ggplot2

Beitrag von student »

Sehr schön! :)

plot3D hat schon etwas und ich hatte vor einiger Zeit über den "Perspektivwechsel" sehr schön einem Auditorium einen "Kompetenzraum" nahebringen können...
Dateianhänge
3D-Beispiel2.jpg
Viele Grüße,
Student
-----------------------------------------------------------------------------------------------------------------------
faes.de, Datenanalyse mit R & das Ad-Oculos-Projekt
Das Ad-Oculos-Projekt auf YouTube

Habe Mut, dich deines eigenen Verstandes zu bedienen! (Kant)
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: size und color_continuous in ggplot2

Beitrag von EDi »

Kann man das irgendwie "einfach" zusammenführen in einer Legende mit verschiedengroßen Punkten in entsprechender Farbe?
So?

Code: Alles auswählen

ggplot(b, aes(x = x, y = y, col = z, size = z)) +
  geom_point(alpha = .7) +
  coord_fixed() +
  theme_bw() +
  guides(color= guide_legend(), size=guide_legend()) +
  scale_color_viridis_c() 
welche kontinuierliche Farbpalette Punkte auf weißem Grund in einen größeren Farbbereich verdeutlicht?
Ich mag viridis oder plasma... https://jmsallan.netlify.app/blog/the-viridis-palettes/
Zuletzt noch: Hat jemand Erfahrung, welches Paket für 3D-Darstellung gute Diagramme macht,
Würde ich generell nicht in print-medien Nutzen. Interaktive Grafiken sind da was anderes, aber nur für web-medien...
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.
bigben
Beiträge: 2781
Registriert: Mi Okt 12, 2016 9:09 am

Re: size und color_continuous in ggplot2

Beitrag von bigben »

Hallo EDi,

das ist genau, wonach ich gesucht habe. Viridis wird übernommen, ob auf weißem Grund oder mit der gelben Farbe doch eher auf Ggplot-grau habe ich noch nicht entschieden.

Code: Alles auswählen

guides(color= guide_legend(), size=guide_legend())
Das löst ganz genau mein Problem, aber ich habe keine Ahnung warum. Offensichtlich ist mein Verständnis von ggplot2 zu oberflächlich und ich muss mich mal hinsetzen, und die Grundlagen lesen. Gibt es eine Leseempfehlung für Menschen, die regelmäßig mit ggplot2 arbeiten aber nicht mehr Einzelanleitungen im Netz suchen, sondern das große Bild und die Zusammenhänge lernen wollen?

Vielen Dank EDi,
damit ist mein Eingangspost vollständig beantwortet.

Liebe Grüße,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Antworten