Problembeschreibung
Ich habe Tausende von Linien (~ 4000), die ich zeichnen möchte. Es ist jedoch nicht möglich, alle Linien mit zu zeichnen geom_line()
und nur alpha=0.1
zu veranschaulichen, wo es eine hohe Liniendichte gibt und wo nicht. Ich bin in Python auf etwas Ähnliches gestoßen , besonders die zweite Handlung der Antworten sieht wirklich gut aus, aber ich weiß jetzt nicht, ob etwas Ähnliches in erreicht werden kann ggplot2
. Also so etwas wie das:
Ein Beispieldatensatz
Es wäre viel sinnvoller, dies mit einem Satz zu demonstrieren, der ein Muster zeigt, aber im Moment habe ich nur zufällige Sinuskurven generiert:
set.seed(1)
gen.dat <- function(key) {
c <- sample(seq(0.1,1, by = 0.1), 1)
time <- seq(c*pi,length.out=100)
val <- sin(time)
time = 1:100
data.frame(time,val,key)
}
dat <- lapply(seq(1,10000), gen.dat) %>% bind_rows()
Versuchte Heatmap
Ich habe eine Heatmap ausprobiert wie hier beantwortet Diese Heatmap berücksichtigt jedoch nicht die Verbindung von Punkten über die gesamte Achse (wie in einer Linie), sondern zeigt die "Wärme" pro Zeitpunkt.
Frage
Wie können wir in R mitggplot2
eine Heatmap von Linien zeichnen, die der in der ersten Abbildung gezeigten ähnlich sind?
ggplot(dat, aes(time, val, group=key)) +stat_pointdensity(geom = "line", size = 0.05, adjust = 10) + scale_color_gradientn(colors = c("blue", "yellow", "red"))
ggpointdensity
Bei genauerem Hinsehen kann man erkennen, dass das Diagramm, mit dem Sie verknüpfen, aus vielen, vielen, vielen besteht Punkten und nicht aus Linien besteht.
Das
ggpointdensity
Paket macht eine ähnliche Visualisierung. Beachten Sie, dass bei so vielen Datenpunkten einige Leistungsprobleme auftreten. Ich benutze die Entwicklerversion, weil sie die enthältmethod
Argument die Verwendung verschiedener Glättungsschätzer ermöglicht und anscheinend dazu beiträgt, mit größeren Zahlen besser umzugehen. Es gibt auch eine CRAN-Version.Sie können die Glättung mit dem
adjust
Argument anpassen .Ich habe die x-Intervalldichte Ihres Codes erhöht, damit er eher wie Linien aussieht. Habe die Anzahl der 'Linien' im Plot leicht reduziert.
Erstellt am 2020-03-19 durch das reprex-Paket (v0.3.0)
update Vielen Dank an Benutzer Robert Gertenbach für die Erstellung weiterer interessanter Beispieldaten . Hier die vorgeschlagene Verwendung von ggpointdensity für diese Daten:
Erstellt am 24.03.2018 durch das reprex-Paket (v0.3.0)
quelle
ggplot(dat, aes(time, val, group=key)) +stat_pointdensity(geom = "line", size = 0.05, adjust = 10) + scale_color_gradientn(colors = c("blue", "yellow", "red"))
sieht das wirklich gut aus!Ich habe die folgende Lösung gefunden, wobei
geom_segment()
ich jedoch nicht sicher bin, ob diesgeom_segment()
der richtige Weg ist, da nur geprüft wird, ob paarweise Werte genau gleich sind, während in einer Heatmap (wie in meiner Frage) auch Werte in der Nähe voneinander betroffen sind die "Hitze", anstatt genau gleich zu sein.quelle