NAME
Quiq::PlotlyJs - Basisfunktionalität/Notizen zu Plotly.js
BASE CLASS
DESCRIPTION
Diese Modul enthält Basisfunktionalität und Notizen zur JavaScript Plot-Bibliothek Plotly.js.
Verweise
Plotly.js - Dokumentation zur Plot-Bibliothek
Time Formats - Formatierung von Zeitangaben
Change the Default Locale - Locale Umstellung
Axis hover formatting - Beliebige Hover-Texte
Empty graph with message - Plot mit Meldung
Get state of chart - Zugriff auf trace, layout usw.
Error Bars - Fehlerbalken
Notizen
Umschaltung einzelne Marker-Farbe, Array von Markerfarben
Ist der Plot auf eine einzelne Markerfarbe eingestellt worden, kann nicht auf ein Array von Markerfarben umgeschaltet werden, ohne die gesamte Marker-Struktur zu setzen. Die Komponente color von einem String auf ein Array umzusetzen reicht nicht!
Falsch:
'marker.color': [...],
Richtig:
marker: {
color: [...],
...
},
Beliebige Hover-Texte definieren
Hover-Texte können ohne Events nicht dynamisch berechnet werden, da Plotly.js nur JSON-serialisierare Strukturkomponenten besitzt und keine Funktionsattribute vorgesehen sind. Das Trace-Attribut text: [...] kann aber genutzt werden, um jedem Wert ein individuelles Label zuzuweisen (Axis hover formatting).
Zeit-Werte
Zeit-Werte werden am besten als Strings der Form YYYY-MM-DD HH:MM:SS
an Plotly.js übergeben. Nur dann ist gesichert, dass diese Zeit auch im Plot erscheint. Übergibt man die Zeit als Epoch-Wert (Millisekunden seit 01.01.1970) oder JavaScript Date-Objekt, wird diese von UTC in die Zeitzone des Browsers umgerechnet. Darauf kann laut der Plotly-Entwickler kein Einfluss genommen werden, da Plotly keine Zeitzonen kennt: Issue 1532.
Diagramm-Höhe
Die Diagramm-Höhe kann im div-Container, in der Layout-Konfiguration oder in beiden gesetzt werden. Die Auswirkungen:
Wird die Höhe nur beim div-Container gesetzt, füllt Plotly die Höhe immer ganz aus. Wird z.B. der Rangeslider entfernt, rendert Plotly das Diagramm neu, so dass es wieder die gesamte Höhe ausfüllt. D.h. der Plotbereich wird höher. Der Inhalt des Diagramms ist nicht statisch. Das wollen wir nicht.
Wird die Höhe nur in der Layout-Konfiguration gesetzt, hat der div-Container zunächst die Höhe 0, bis das Diagramm (typischerweise im ready-Handler) aufgebaut wird. Das wollen wir auch nicht.
Wird die Höhe im div-Container und in der Layout-Konfiguration gesetzt, ist der Bereich des Diagramms auf der Seite sofort sichtbar, der Inhalt kann aber aber statisch gehalten werden, indem beide Angaben gemeinsam geändert werden.
Unterer Rand
Im unteren Rand ist die Beschriftung der X-Achse und der Rangeslider angesiedelt. Die Beschriftung hat einen Platzbedarf von 55 Pixeln, die Dicke des Rangesliders ist auf 20% der Plothöhe eingestellt. Wir nutzen folgende Formel, um aus der Höhe des Diagramms die Höhe des unteren Rands zu berechnen:
bottomMargin = (height - 300) / 50 * 10 + 110;
Das ergibt folgende Werte (height->marginBottom):
250->100, 300->110, 350->120, 400->130, 450->140,...
Wenn wir den Rangeslider entfernen, reduzieren wir die Höhe des Diagramms und den unteren Rand um
marginBottom - 55
Titel-Positionierung
Der Diagramm-Titel wird per Default leider ungünstig positioniert, daher positionieren wir ihn selbst. Damit der Titel oberhalb des Plot-Bereichs positioniert werden kann, muss im Layout container
als Bezugsbereich vereinbart werden:
title: {
yref: 'container',
yanchor => 'top',
y => $y0,
}
Hierbei ist $y0 ein Wert zwischen 0 und 1, der die vertikale Position innerhalb des Diagramms festlegt. 1 -> ganz oben unter dem Rand, 0 -> ganz unten unter (!) dem Rand.
Ändert sich die Höhe des Diagramms, muss der Wert y auf die neue Höhe y1 umgerechnet werden:
y1 = 1 - (height0 * (1 - y0) / height1);
Raum unter der Achse einfärben
Ist beim Trace-Layout das Füllen unter der Achse angegeben mit
fill: 'tozeroy',
fillcolor: '#e0e0e0',
wird der Y-Wertebereich nach unten bis 0 ausgedehnt, wenn kein Y-Wertebereich explizit vorgegeben ist. Ist für die Y-Achse (im Diagramm-Layout!) explizit ein Wertebereich vorgegeben, z.B.
range => [900,1000],
findet die Ausdehnung bis 0 nicht statt, der Raum unter der Kurve wird dennoch wie gewünscht gefüllt.
METHODS
Klassenmethoden
cdnUrl() - Liefere CDN URL
Synopsis
$url = $this->cdnUrl;
Returns
URL (String)
Description
Liefere den CDN URL der neusten Version von Plotly.js.
Example
$url = Quiq::PlotlyJs->cdnUrl;
==>
https://cdn.plot.ly/plotly-latest.min.js
VERSION
1.222
AUTHOR
Frank Seitz, http://fseitz.de/
COPYRIGHT
Copyright (C) 2024 Frank Seitz
LICENSE
This code is free software; you can redistribute it and/or modify it under the same terms as Perl itself.