Seite 1 von 1

size und color_continuous in ggplot2

Verfasst: Fr Dez 29, 2023 11:31 pm
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

Re: size und color_continuous in ggplot2

Verfasst: Sa Dez 30, 2023 9:15 am
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....

Re: size und color_continuous in ggplot2

Verfasst: Mo Jan 01, 2024 11:07 am
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

Re: size und color_continuous in ggplot2

Verfasst: Mo Jan 01, 2024 12:34 pm
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... :?

Re: size und color_continuous in ggplot2

Verfasst: Mo Jan 01, 2024 5:41 pm
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.

Re: size und color_continuous in ggplot2

Verfasst: Mo Jan 01, 2024 6:00 pm
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

Re: size und color_continuous in ggplot2

Verfasst: Di Jan 02, 2024 12:27 pm
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...

Re: size und color_continuous in ggplot2

Verfasst: Do Jan 04, 2024 12:10 am
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...

Re: size und color_continuous in ggplot2

Verfasst: Do Jan 04, 2024 9:11 am
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