In folgendem Artikel soll es darum gehen, wie sich mit Hilfe der ILNumerics-Bibliotheken in C# aufwendige Graphen zeichenen lassen – auf Wunsch sogar interaktiv.
Wie bei fast allen Artikel dieser Art hier im Blog, stelle ich zuerst kurz die Library vor, gehe dann auf die nötigen Grundlagen für das spätere Coding ein und zeige euch abschließend Schritt für Schritt den weg dorthin. Los geht’s!
Was ist ILNumerics?
ILNumerics ist eine .NET-Klassenbibliothek die aus mehreren Komponenten besteht. Die beiden Kernkomponenten sind hierbei die Computing- und die Visualization-Engine. ILNumerics erweitert das .NET-Framework unter anderem um komplexe Zahlen, Skalar-Rechnung, Vektoren, Matrizen und Matrizenrechnung sowie beliebig Dimensionale Datenstrukturen.
Eine weitere Stärke ILNumerics’ ist die Visualization-Engine, die es ermöglicht 2- und 3-dimensionale Graphen zu plotten, worauf auch der Fokus dieses Artikels liegt.
Was kostet ILNumerics?
Wer schon einmal mit ILNumerics zu tun hatte, der mag vielleicht noch auf dem Stand sein, dass ILNumerics komplett kostenlos ist. Diese Information stammt aus den Jahren 2007-2011 als ILNumerics kostenfrei unter LGPL verbreitet wurde.
Seit 2011 wird ILNumerics jedoch unter einer proprietären Lizenz vertrieben, die bei monatlicher Zahlweise als Subscription-Modell bei 89€ oder bei jährlicher Zahlweise bei 1.300€ beginnt. Das Subscription-Modell bietet entgegen dem Perpetual-Modell Updates, Upgrades und Support.
Weiterhin gibt es natürlich die Möglichkeit eines kostenlosen Trials, um die Fähigkeiten der Libraries zu evalurieren.
Projektidee und Datengrundlage
Kommen wir zu dem Übungsprojekt, welches wir heute umsetzen wollen. Ziel soll es sein, mehrere tausend Punkte in einem 3D-System zu plotten.
Bei den Punkten handelt es sich je um die drei Ausprägungen “Downloadzahl”, “Rating” und “Preis” eines jeden WordPress-Plugins auf CodeCanyon, die auf je einer Achse des 3D-Graphen abgebildet werden sollen.
Solltet ihr das Beispiel mit tagesaktuellen Daten nachvollziehen wollen, könnte ihr meinen kleinen Python-Crawler nutzen, den ich eigens für die Beschaffung dieser Daten geschrieben habe.
Das Thema ist nun klar und die Daten sollten mit dem Crawler beschafft sein. Kommen wir zur Umsetzung in C#.
3D-Diagramm in C# erstellen
Zuerst benötigen wir Projekt im Visual Studio – der Einfachheit halber reicht hier ein WinForms-Projekt. Nun ziehen wir im Form-Designer die Komponente ILPanel aus der Toolbox auf das Form. (Die Komponente sollte sich nach der Installation von ILNumerics im Reiter “ILNumerics” in der Toolbox befinden. Ist dem nicht so, reicht ein Rechtsklick in die Toolbox, dann “Element auswählen…”, um die ILNumerics-Controls zu suchen und hinzuzufügen.)
Ist das ILPanel hinzugefügt, kann es im Code losgehen. Da der Code recht übersichtlich ist, entnehmt ihr die Funktionsweise des Codes bitte den Kommentaren im Quelltext.
//When form loads... private void Form1_Load(object sender, EventArgs e) { //Open a filestream and read the data points into an comma-seperated string StreamReader sr = new StreamReader(Application.StartupPath + "\\stats_plugins.csv"); string dataLines = string.Empty; while (sr.Peek() != -1) dataLines += sr.ReadLine().Replace(";",",") + "\n"; sr.Close(); dataLines = dataLines.Trim('\n'); //Convert the data-string into an ILArray ILArray<int> AN = ILMath.csvread<int>(dataLines); //Create a new scene, which is the base for our graph var scene = new ILScene(); using (ILScope.Enter()) { //Convert all data points to float ILArray<float> A = ILMath.tosingle(AN); //Add a plot to the scene and configure it scene.Add(new ILPlotCube { //Render in 3D TwoDMode = false, //Add 3 axes Axes = { XAxis = { Label = { Text = "Price in $" }, GridMajor = { DashStyle = DashStyle.Dashed, Color = Color.DarkGray, Width = 1 } }, YAxis = { Label = { Text = "Rating count" }, GridMajor = { DashStyle = DashStyle.Dashed, Color = Color.DarkGray, Width = 1 } }, ZAxis = { Label = { Text = "Download count" } } }, //Add the data points Children = { new ILPoints { Positions = A }, }, //Set start rotation for 3D rendered graph Rotation = Matrix4.Rotation(new Vector3(1, 1, 1), 0.5f) }); } //Add the scene to the ILPanel ilPanel1.Scene = scene; }
Dieser Code reicht schon aus, um nebenstehendes Ergebnis zu erhalten. Durch die Verwendung des ILPanels erhält man nicht nur einen ansehnlichen 3D-Plot, sondern kann diesen auch noch drehen, zoomen und verschieben.
Das ILPanel ist übrigens nur eine Möglichkeit eine Scene darzustellen. So ist es zum Beispiel auch möglich ein SVG aus der Scene zu erstellen, welches sich für die Darstellung in Webprojekten eignet. Einen guten Artikel hierzu bietet Scott Hanselman auf seinem Blog.
Fazit
Die Ergebnisse (am Ende des Absatz) können sich sehen lassen. Ohne großen Aufwand lassen sich auch schwierige Graphen plotten, wobei ich zugeben muss, dass ILNumerics noch wesentlich mehr kann, was jedoch wiederum meine mathematischen Fähigkeiten übersteigt.
Der Preis hingegen ist ein Klopper. 89€ monatlich habe ich derzeit definitiv nicht über. Je nach Kunde und Auftrag oder für größere Unternehmen, sollte der Preis in anbetracht der gebotenen Leistung jedoch kein Hindernis darstellen.
Abschließend noch drei Links zum leichten Einstieg und bei Problemen.
The Zune concentrates on being a Portable Media Player. Not a web browser. Not a game machine. Maybe in the future it’ll do even better in those areas, but for now it’s a fantastic way to organize and listen to your music and videos
super blog! hat mir sehr geholfe, danke!
lg vom kalterer see
Schaut sehr interessant aus. Ist das denn auch für einen mathematischen bzw. statistischen Laien zu verstehen und zu bedienen? Gibt es extra studenten Preise?
Lieben Gruß aus Wengen in Südtirol!