# install.packages("plotly")
library(ggplot2)
library(plotly)R Tutorial: plotly
Dieses Tutorial basiert auf Arbeiten von BMARSYS-Studierenden im begleitenden Seminar zum DS2-Modul und wurde redaktionell überarbeitet.
Das R-Paket plotly ermöglicht die Erstellung interaktiver Grafiken mit Funktionen wie Zoomen, Tooltips, Animationen und 3D-Darstellungen. Im Gegensatz zu statischen ggplot2-Grafiken können Nutzer in plotly-Grafiken direkt mit den Daten interagieren — besonders nützlich für explorative Analysen und HTML-Berichte. Die plotly-Bibliothek basiert auf der JavaScript-Bibliothek plotly.js und ist neben R auch für Python und Julia verfügbar.
Installation
Von ggplot2 zu plotly
Der einfachste Einstieg in plotly führt über bestehende ggplot2-Grafiken. Die Funktion ggplotly() nimmt ein ggplot-Objekt und wandelt es in eine interaktive plotly-Grafik um. Dabei bleiben alle Aesthetics erhalten und werden automatisch in Tooltips übersetzt. Probiere es aus — fahre mit der Maus über die Datenpunkte:
p <- ggplot(data = mtcars, aes(x = wt, y = mpg, size = gear, colour = cyl)) +
geom_point()
# Statische ggplot-Grafik
p
# Interaktive plotly-Grafik
ggplotly(p)Der Vorteil von ggplotly(): Man kann die gewohnte ggplot2-Syntax verwenden und muss keine neue Grammatik lernen. Allerdings unterstützt ggplotly() nicht alle ggplot2-Funktionen — bei komplexen Grafiken kann die direkte Verwendung von plot_ly() nötig sein (siehe unten).
Menüleiste anpassen
Jede plotly-Grafik enthält eine Menüleiste (Modebar) am oberen rechten Rand mit Werkzeugen zum Zoomen, Verschieben, Auswählen und Herunterladen. Mit config() lässt sich die Menüleiste anpassen oder komplett ausblenden:
cars_p <- ggplotly(p)
# Menüleiste komplett ausblenden
config(cars_p, displayModeBar = FALSE)# plotly-Logo entfernen
config(cars_p, displaylogo = FALSE)# Einzelne Schaltflächen entfernen
config(cars_p, modeBarButtonsToRemove = c("zoomIn2d", "zoomOut2d"))# Startwerkzeug festlegen
layout(cars_p, dragmode = "zoom") # oder "pan"Tooltips
Tooltips sind die Informationsfenster, die beim Überfahren eines Datenpunkts mit der Maus erscheinen. Standardmäßig zeigt plotly alle definierten Aesthetics an. Mit dem tooltip-Argument in ggplotly() lässt sich auswählen, welche Variablen im Tooltip erscheinen sollen — entweder über den Aesthetic-Namen oder den Variablennamen:
# Nur bestimmte Aesthetics im Tooltip
ggplotly(p, tooltip = c("size", "colour"))# Oder über Variablennamen
ggplotly(p, tooltip = c("gear", "cyl"))Bei Liniengrafiken öffnet sich das Tooltip-Fenster oft nicht zuverlässig. Es ist daher empfehlenswert, geom_point() über Liniengrafiken zu legen, damit die Tooltips an den Datenpunkten erscheinen.
Interaktive Karten
Auch ggplot2-Karten können mit ggplotly() interaktiv gestaltet werden. Ein besonderer Trick: Das Aesthetic text wird von ggplot2 ignoriert, aber von plotly im Tooltip angezeigt. So lassen sich zusätzliche Informationen (z.B. Städtenamen) einblenden. Bei sehr vielen Datenpunkten sorgt toWebGL() für deutlich bessere Performance, da das Rendering an die Grafikkarte delegiert wird:
library(maps)
data(world.cities, package = "maps")
world_gg <- ggplot(world.cities, aes(x = long, y = lat, text = name)) +
borders(database = "world") +
geom_point(aes(size = pop), alpha = 0.5) +
coord_fixed(ratio = 1.3)
# Das Aesthetic "text" wird von ggplot2 ignoriert, aber von plotly im Tooltip angezeigt
world_p <- ggplotly(world_gg, tooltip = c("text", "size"))
# WebGL-Rendering für bessere Performance
toWebGL(world_p)Animationen
plotly kann Daten über die Zeit oder eine Gruppierungsvariable animieren. Mit dem Aesthetic frame wird festgelegt, welche Variable die Animation steuert. Ein Play-Button und ein Slider erscheinen automatisch unter der Grafik:
p2 <- ggplot(mtcars, aes(x = wt, y = mpg, colour = factor(cyl))) +
geom_point(aes(size = sqrt(wt), frame = gear))
ggplotly(p2)Für komplexere Animationen eignet sich der gapminder-Datensatz von Hans Rosling — ein Klassiker der Datenvisualisierung. Hier wird die Entwicklung von Lebenserwartung und BIP pro Kopf über die Zeit animiert, wobei die Punktgröße die Bevölkerungszahl widerspiegelt:
# install.packages("gapminder")
library(gapminder)
fig <- plot_ly(
data = gapminder,
x = ~gdpPercap,
y = ~lifeExp,
size = ~pop,
color = ~continent,
frame = ~year,
text = ~country,
hoverinfo = "text",
type = "scatter",
mode = "markers"
)
figDie Animationsgeschwindigkeit und der Übergangseffekt lassen sich mit animation_opts() anpassen. easing bestimmt die Übergangskurve (z.B. "elastic" für einen federnden Effekt), und die Zahl gibt die Dauer in Millisekunden an:
fig %>%
animation_opts(1000, easing = "elastic", redraw = FALSE)Direkte plotly-Grafiken mit plot_ly()
Neben der Umwandlung von ggplot2-Grafiken können mit plot_ly() auch direkt interaktive Grafiken erstellt werden. Die Syntax ist anders als bei ggplot2: Variablen werden mit ~ referenziert (Formelnotation), und Grafiktypen werden als type-Argument oder über add_*()-Funktionen angegeben. plot_ly() ist besonders nützlich für Grafiktypen, die ggplot2 nicht unterstützt — z.B. 3D-Grafiken:
# Einfacher Scatterplot
plot_ly(
data = mtcars,
x = ~wt,
y = ~mpg,
size = ~gear,
color = ~cyl
)Geographische Karten mit plot_geo()
Mit plot_geo() lassen sich Daten direkt auf einer Weltkarte darstellen. Die Funktion verwendet intern eine Mercator-Projektion und OpenStreetMap-ähnliche Basiskarten:
plot_geo(world.cities, lat = ~lat, lon = ~long) %>%
add_markers(text = ~paste(name, pop))3D-Oberflächendiagramme
Ein Highlight von plotly sind 3D-Grafiken, die sich mit der Maus drehen und kippen lassen. add_surface() erzeugt ein Oberflächendiagramm aus einer Matrix — hier am Beispiel des in R eingebauten volcano-Datensatzes (topographische Daten des Maunga Whau in Auckland):
plot_ly(z = ~volcano) %>%
add_surface()Grafiken exportieren
In der Menüleiste gibt es eine Download-Schaltfläche (Kamera-Symbol), mit der die aktuelle Ansicht als Bild heruntergeladen werden kann. Standardmäßig wird ein PNG erzeugt. Mit config() lassen sich Format (PNG, SVG, JPEG, WebP), Dateiname und Auflösung festlegen:
config(
world_p,
toImageButtonOptions = list(
format = "svg",
filename = "Weltstaedte",
width = 600,
height = 400
)
)SVG eignet sich besonders für Publikationen, da es ein Vektorformat ist und sich ohne Qualitätsverlust skalieren lässt.