Blog der Heimetli Software AG

Polare Darstellung von Plotly Express animieren

Die Dokumentation der Library ist sehr schwach in diesem Bereich und auch im Internet habe ich kein Beispiel gefunden.

Nach einigem herumprobieren ist es mir aber gelungen einen animierten Chart mit frei erfundenen Daten zu erstellen:

Screenshot des Diagramms

Auf dieser Seite gibt es keine Animation, weil die HTML-Seite 16MB gross wird!

Der animierte Graph

Falls Sie gewillt sind eine so grosse Seite zu laden, dann klicken Sie auf animiertes Plotly-Diagramm.

Ein Klick auf den Play-Button beschleunigt die Animation. Beim Autoplay habe ich keine Option für die Geschwindigkeit gefunden.

Die Seite ist nachbearbeitet um ihr ein ähnliches Aussehen wie die Blog-Einträge zu geben. Es ist mir nicht gelungen das übliche Layout zu nutzen, weil das zu Darstellungsfehlern führte.

Das JavaScript in der Seite hat ganz eigene Ansichten wie das Layout aussehen soll, und reagiert ziemlich unberechenbar auf Aenderungen der HTML-Struktur oder vom CSS. Eine Dokumentation dazu habe ich nicht gefunden.

Wem dies hier zu schwerfällig ist kann sich die gleiche Darstellung mit D3 ansehen.

Das Python-Programm

Der Code ist überraschend kurz:

import plotly.express as px
import pandas as pd

# Load the data file
df = pd.read_csv( "polar.csv" )

# Define the plot
df["point"] = df["point"].apply( lambda d: d * 360 / 365 )
fig = px.line_polar(df, r="Wert", theta="point", line_close=False,
                    animation_frame="Tag",animation_group="Tag",range_r=[0,75],
                    color_discrete_sequence=px.colors.sequential.Plasma_r,
                    template="plotly_dark")

# Override the default axis
fig.layout.polar.angularaxis["tickmode"] = "array"
fig.layout.polar.angularaxis["tickvals"] = [0,30.57534247,58.19178082,88.76712329,118.3561644,148.9315068,178.5205479,209.0958904,239.6712329,269.260274,299.8356164,329.4246575]
fig.layout.polar.angularaxis["ticktext"] = ["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"]

# Speed up the animation
fig.layout.updatemenus[0]["buttons"][0]["args"][1]["frame"]["duration"] = 50
fig.layout.updatemenus[0]["buttons"][0]["args"][1]["transition"]["duration"] = 0

# Generate an HTML file from the definitions above
fig.write_html( "polar.html" )

Der Graph war schnell erstellt, die Achsen dauerten länger, die Animation noch länger...

Probleme

Die Darstellung hat noch folgende Probleme:

  • Die gewünschte Geschwindigkeit gibt es nur wenn man den Button klickt, sonst läuft die Animation langsamer
  • Die Tooltips funktionieren nicht vernünftig, weil die ganze Linie als Einheit betrachtet wird

Das Datenfile

Studieren Sie das Datenfile sehr genau, denn nur so gab es eine animierte Darstellung:

Tag,point,Wert
"01.01.18",0,33.0264791275622
"02.01.18",0,33.0264791275622
"02.01.18",1,50.23564716870469
"03.01.18",0,33.0264791275622
"03.01.18",1,50.23564716870469
"03.01.18",2,53.15636351184351
"04.01.18",0,33.0264791275622
"04.01.18",1,50.23564716870469
"04.01.18",2,53.15636351184351
"04.01.18",3,53.3859972224156
"05.01.18",0,33.0264791275622
"05.01.18",1,50.23564716870469
"05.01.18",2,53.15636351184351
"05.01.18",3,53.3859972224156
"05.01.18",4,54.71566858468588
"06.01.18",0,33.0264791275622
"06.01.18",1,50.23564716870469
"06.01.18",2,53.15636351184351
"06.01.18",3,53.3859972224156
"06.01.18",4,54.71566858468588
"06.01.18",5,59.651579703473175

Der erste Wert tritt einmal auf, und wird gar nicht dargestellt. Der zweite Datenpunkt umfasst zwei Werte was eine Linie ergibt. Der dritte Datenpunkt umfasst schon drei Werte, der vierte vier...

Die dargestellte Linie wird also für jeden Tag einen Punkt länger.

Wenn es mehr als ein paar Punkte sind, lässt man die Datenpunkte am besten von einem Script so arrangieren. Manuell ist es sehr mühsam und fehleranfällig.