Brücke zwischen Gnuplot und sQLshell

vorhergehende Artikel in: Java Komponenten sQLshell GUI
11.08.2023

Ich habe ein neues Plugin für die sQLshell geschrieben, das Gnuplot noch enger in die Anwendung integriert:

Ich fand ein Projekt, das die 1000 erdnächsten Sonnen visualisierte. Im Projekt geschah das in MatLab, aber ich dachte dabei sofort an andere Visualisierungsmöglichkeiten.

Ich versuchte zunächst - da ich das noch nie getan hatte - eine Visualisierung per Bubble-Chart in Gnuplot. Dabei sollten die Sonnen in einer 3D-Ansicht entsprechend ihrer Positionen visualisiert werden. Die Größe jeder "Bubble" sollte ihre relative Größe veranschaulichen und die Farbe ihre Temperatur.

Das folgende Skript erledigt genau das:

set term qt
set termoption enhanced
set size square
set datafile separator "\t"
#Scale(size) = 1+log(column(size))
Scale(size) = 1+0.3*column(size)
Popup(name) = sprintf("%s", stringcolumn(name))
set border 0
stats 'stars.dat' using 5 name "A"
set palette model RGB
#set palette defined (0 '#ff0000', 0.25 '#ffff00', 0.5 '#0000ff', 1 '#DDA0DD' )
set palette defined (0 '#ff0000', 0.5 '#ffff00', 0.75 '#0000ff', 1 '#0000ff' )
#set palette defined (0 'red', 0.5 'yellow', 0.75 'blue', 1 'blue' )
set cbrange [A_min:A_max]
splot 'stars.dat' using 1:2:3:(Popup(6)):(Scale(4)) with labels hypertext point pt 6 ps var lc palette, 'stars.dat' using 1:2:3:(Scale(4)):5 with points pt 7 ps var lc palette, 'stars.dat' using 1:2:3:(Scale(4)) with points pt 6 ps var lc rgb "black" lw 0.1
pause -1

Damit war ich jedoch noch nicht zufrieden - zwar konnte ich die dreidimensionale Darstellung (da ich das Gnuplot-Terminal "qt" benutzte) drehen und zoomen, aber ich konnte eben genau nur diese Darstellung von allen Seiten betrachten. Wenn ich nach bestimmten Sternen filtern wollte - etwa um nur bestimmte Spektralklassen zu betrachten - musste dies mühsam von Hand tun. Und wenn ich an Daten und filtern denke, denke ich an die sQLshell.

Die sQLshell hat zum Glück einen eingebauten CSV-JDBC-Treiber, sodass es eine Sache von Sekunden war, die Datei in der sQLshell als Tabelle zu sehen und entsprechend filtern zu können. Allerdings wollte ich nicht mühsam von Hand ein Skript schreiben, - nur um diese Daten zu sehen: Ich wollte eine generische Möglichkeit schaffen. Dazu überlegte ich mir, spezielle Kommentare in einem Gnuplot-Skript zu suchen, die die sQLshell darüber informieren würden, wieviele Spalten welchen Namens (und welche Datentypen) das jeweilige Gnuplot-Skript zum Funktionieren benötigt. Die sQLshell müsste dann dem Anwender einen maßgeschneiderten Dialog präsentieren, der es erlauben würde ein Mapping zwischen diesen Spalten und denen eines Ergebnis-Views in der sQLshell herzustellen. Gesagt - getan: Es gibt nun ein neues Plugin, das genau das tut.

Ein Beispiel für ein solches Skript ist die etwas angepasste Variante des oben dargestellten Skripts:

#sQLshell	1	java.lang.Number	Position x
#sQLshell	2	java.lang.Number	Position y
#sQLshell	3	java.lang.Number	Position z
#sQLshell	4	java.lang.Number	Radius
#sQLshell	5	java.lang.Number	Effective Temperature
#sQLshell	6	java.lang.Object	Name

set term qt set termoption enhanced set size square set datafile separator "\t" #Scale(size) = 1+log(column(size)) Scale(size) = 1+0.3*column(size) Popup(name) = sprintf("%s", stringcolumn(name)) set border 0 stats filename using 5 name "A" set palette model RGB #set palette defined (0 '#ff0000', 0.25 '#ffff00', 0.5 '#0000ff', 1 '#DDA0DD' ) set palette defined (0 '#ff0000', 0.5 '#ffff00', 0.75 '#0000ff', 1 '#0000ff' ) #set palette defined (0 'red', 0.5 'yellow', 0.75 'blue', 1 'blue' ) set cbrange [A_min:A_max] splot filename using 1:2:3:(Popup(6)):(Scale(4)) with labels hypertext point pt 6 ps var lc palette, filename using 1:2:3:(Scale(4)):5 with points pt 7 ps var lc palette, filename using 1:2:3:(Scale(4)) with points pt 6 ps var lc rgb "black" lw 0.1 pause -1

Dieses Skript zeigt die Darstellung unter Verwendung des QT Terminals von Gnuplot an und wartet darauf, dass der Anwender das fenster schließt. Der Nutzer kann die Darstellung interaktive erforschen (Dregen, Zoomen, ...) Die GUI für die Spezifikation des Mapping sieht zum Beispiel so aus:

Screenshot Dialog zur Definition des Mapping zwischen Spalten aus dem Gnuplot-Skript und denen eines Ergebnis-Views in der sQLshell

Ein Beispiel für das Ergebnis der Visualisierung der 1000 erdnächsten Sonnen mittels dieses Skripts kann man hier sehen:

Screenshot Ergebnis bei Benutzung des neuen Plugins der sQLshell in Verbindung mit dem gezeigten Gnuplot-Skript

Und wenn man unter den 1000 erdnächsten nur diejenigen mit einem Radius herausfiltert, der größer ist als der der Sonne - zum Beispiel durch die Anweisung select * from StarsCartesian where radius>1 erhält man mit dem Ergebnis dieser Abfrage als Datengrundlage und diesem Plugin folgende Visualisierung:

Screenshot Ergebnis bei Benutzung des neuen Plugins der sQLshell in Verbindung mit dem gezeigten Gnuplot-Skript und dem Filter zur Darstellung von Sternen mit größerem Radius als unserer Sonne

Alle Artikel rss Wochenübersicht Monatsübersicht Github Repositories Gitlab Repositories Mastodon Über mich home xmpp


Vor 5 Jahren hier im Blog

  • Fährnisse des Buildprozesses unter Windows

    17.07.2019

    Nachdem ich begonnen hatte, mich mit der Beschleunigung der Berechnung des Mandelbrot-Fraktals unter Zuhilfenahme der Shadereinheiten in Graphikkarten zu beschäftigen und erste Erfolge feiern konnte, wollte ich das mal auf einer richtigen Graphikkarte ausprobieren...

    Weiterlesen...

Neueste Artikel

  • Datenvalidierung UTF8 mit BiDi-Steuerzeichen (TrojanSource 2.0)

    Ich bin heute nochmal inspiriert worden, weiter über die Trojan Source Vulnerability nachzudenken. Meiner Meinung nach bestehen hier noch Probleme - speziell bei Nutzereingaben oder Daten, die über externe Schnittstellen ampfangen werden.

    Weiterlesen...
  • OpenStreetMap Navi als Docker-Container

    Ich habe die auf OpenStreetMap basierende OpenSource Navigationslösung Graphhopper in einen Docker-Container gepackt und als neuestes Mitglied in meinem Docker-Zoo willkommen geheißen.

    Weiterlesen...
  • SQL-Aggregatfunktionen in SQLite als BeanShell-Scripts

    Ich habe neulich über eine Möglichkeit berichtet, SQLite mittels der sQLshell und Beanshell-Skripten um SQL-Funktionen zu erweitern. In diesem Artikel versprach ich auch, über eine solche Möglichkeit für Aggregatfunktionen zu berichten.

    Weiterlesen...

Manche nennen es Blog, manche Web-Seite - ich schreibe hier hin und wieder über meine Erlebnisse, Rückschläge und Erleuchtungen bei meinen Hobbies.

Wer daran teilhaben und eventuell sogar davon profitieren möchte, muß damit leben, daß ich hin und wieder kleine Ausflüge in Bereiche mache, die nichts mit IT, Administration oder Softwareentwicklung zu tun haben.

Ich wünsche allen Lesern viel Spaß und hin und wieder einen kleinen AHA!-Effekt...

PS: Meine öffentlichen GitHub-Repositories findet man hier - meine öffentlichen GitLab-Repositories finden sich dagegen hier.