vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Blitzschnelles Erstellen von grafischen Diagrammen!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Ansatz zur Realisierung Multi-Line-Chart 
Autor: Dot
Datum: 22.01.18 11:07

Hallo Gemeinde,

ich bräuchte für die Realisierung eines Line-Chart-Controls Hilfe.

Folgende Gegebenheit:

Es existieren für ein und dieselbe Zeitbasis verschiedene Aufzeichnungswerte (Kanäle).
=>
In einer Datentabelle sind für jeweils einen Zeitstempel (X-Achse) mehrere Y-Werte (Kanäle) vorhanden.
Diese sollen in einem Control grafisch angezeigt werden.

https://www.google.de/url?sa=i&rct=j&q=&esrc=s&source=images&cd=&cad=rja&uact=8&ved=0ahUKEwib8ID3qOvYAhUEzKQKHSGxAKMQjRwIBw&url=https%3A%2F%2Fbl.ocks.org%2Fjosiahdavis%2F7a02e811360ff00c4eef&psig=AOvVaw0DmUiHNrpPc-qTGj0lwmWb&ust=1516701860744050

Dabei gilt folgendes:

- jeder Kanal (Y-Werte) hat eine eigene Skalierung mit Achsbeschriftung
- die Anzahl der Kanäle ist beliebig (bis max. 32)
- die Datenmenge kann recht groß werden (bis 500000 X-Werte * Anzahl Kanäle)
- es soll Zoomen und Verschieben des X-Achsen-Abschnitt möglich sein
- es sollen vertikale Hilfslinien per Maus einblendbar sein
- die Datenquelle ist statisch und wird nicht dynamisch erweitert

Folgende Überlegungen:

- der darzustellende X-Achsenabschnitt ist bekannt
- müssen in diesem gewählten Abschnitt mehr Datenpunkte angezeigt werden als Auflösung vorhanden ist, wie wird dann vorgegangen? (Anzeige von nur jedem 2ten, 3tem, ... Wert?)
- soll die Grafik selbst gerendert werden oder rendern lassen (WPF), sind aber sehr viele Objekte.
- wie reagiert die Anwendung flott wenn der Anwender zoomt oder den Ausschnitt verschiebt?

Für mögliche Denkanstöße wäre ich dankbar.
0
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Ansatz zur Realisierung Multi-Line-Chart 
Autor: Manfred X
Datum: 22.01.18 18:01

Hallo!

Ziemlich unklar!

[I]- jeder Kanal (Y-Werte) hat eine eigene Skalierung mit Achsbeschriftung
- die Anzahl der Kanäle ist beliebig (bis max. 32)[/I]

Wenn jeder Kanal eine eigene Skala besitzt, wieso sollen diese
Kanäle {Werte) in ein Diagramm?
Die gemeinsame Darstellung erfordert Skalengleichheit.
Gegebenenfalls sind die Werte geeignet zu transformieren.

Für die Gestaltung des Diagramms gibt es keine allgemeinen Regeln.
Die korrekte Wahl der Vorgehensweise hängt von dem Datenmaterial
und der Aussage-Absicht ab.
Man kann für eine Glättung z.B. gleitende Mittelwerte berechnen.
Eventuell können lokale Daten-Maxima und Daten-Minima durch Hilfslinien
gekennzeichnet werden - usw.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Ansatz zur Realisierung Multi-Line-Chart 
Autor: Dot
Datum: 23.01.18 16:12

Hallo,

Manfred X schrieb:
Zitat:



Wenn jeder Kanal eine eigene Skala besitzt, wieso sollen diese
Kanäle {Werte) in ein Diagramm?
Die gemeinsame Darstellung erfordert Skalengleichheit.
Gegebenenfalls sind die Werte geeignet zu transformieren.



Da hab ich mich etwas unverstndlich ausgedrückt.
Die Kanäle sollen in ein gemeinsames Diagramm da diese alle die gleich Zeitbasis haben.
Werte kommen aus einer Trace-Aufzeichnung aus einem Servosystem.
Jeder Kanal kann aber einen anderen Datentyp und auch andere Informationen beinhalten.

z.B.
Geschwindigkeit => Double
interner Zustand => Integer
Freigabe => Boolean

Wenn die Werte nun betrachtet werden, macht es bei Zoom oder Scrollen nur Sinn alle Kanäle gleichzietig zu Zoomen oder zu scrollen.
0
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Ansatz zur Realisierung Multi-Line-Chart 
Autor: Manfred X
Datum: 23.01.18 20:28

Hallo!

Was Du beschreibst, ergibt nicht EIN Diagramm, sondern mehrere
Diagramme, die lediglich eine gemeinsame X-Achse (Zeit) haben.

Es sollte Dir klar sein, daß ein Diagramm mit bis zu 32 * 500000 Werten
sinnlos ist. Da hilft auch kein "Zoomen".

Welche Information der Zeitreihe (Kanäle) soll visualisiert werden?
- Lage und Streuung
- durchgehende Trends
- lokale Abweichungen vom Grund-Trend
- Trendbrüche
- Frequenzbezogene Informationen
- Saisonale Eigenheiten
- Kreuzkorrelationen
- usw.

Beim "Zoomen" verwendet man z.B. Gleitende Mittelwerte (Glättung),
deren Bereichsbreite abhängig von der Anzahl der Daten im gewählten
Zeitbereich ist. Man berechnet z.B. stets 200 Gleitmittelwerte für ein
Diagramm. Damit wird der Verlauf der Reihe für den Betrachter erkennbar.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Ansatz zur Realisierung Multi-Line-Chart 
Autor: Franki
Datum: 25.01.18 03:41

Hallo,

Zitat:

Da hab ich mich etwas unverstndlich ausgedrückt.
Die Kanäle sollen in ein gemeinsames Diagramm da diese alle
die gleich Zeitbasis haben.


Soweit so gut eine gemeinsame Achse ist ein Ausgangspunkt.

Zitat:


Jeder Kanal kann aber einen anderen Datentyp und auch andere
Informationen beinhalten. z.B. Geschwindigkeit = Double
interner Zustand = Integer Freigabe = Boolean


Und hier liegt dein Problem, du versuchst Äpfel mit Birnen in einem Aufwasch zu vergleichen. Das kann nur "Obstsalat" ergeben. Das wäre noch evtl. sinnvoll wenn du die beteiligten Obssorten im Diagramm darstellen möchtest. Aber wenn du dann noch die Kalorien der Mischung darstellen möchtest ist der Unterschied zwischen den Werten zu groß um diese in einem Diagramm darstellen zu können.

Da wären die Linien des Diagramms gleich 0 bzw. nicht wirdklich unterscheidbar bzw. aussagekräftig. Selbst wenn du einen Skalierungsfaktor einführst > 1000 z.B. würde das optisch nicht wirklich was her geben. Zoom hilft da nicht, das wäre wie unter dem Mikroskop betrachtet wenn du ein Detail darstellen möchtest und da kannst du nicht den gesamten Bereich darstellen.

Verwende eine hierarchichse Darstallungsform die du dem User anbietest für den Zoom so dass er den gesünschten Bereich optisch angezeigt bekommt.

Gruß
Frank
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Ansatz zur Realisierung Multi-Line-Chart 
Autor: Dot
Datum: 25.01.18 12:15

Hallo, wieso versuche ich Äpfel mit Birnen zu vergleichen.

Zum besseren Verständnis habe ich ein weiteres Bild:

https://www.dropbox.com/s/cm8fplzdx1452al/Mehrkanalschrieb_1.jpg?dl=0


Da die Aufzeichnung weit aus mehr Daten enthält als sinnvoll auf den Monitor angezeigt werden können, ist es notwendig die Daten sinnvoll für die Anzeige aufzubereiten.
Möchte man den vollständigen zeitlichen Signalverlauf anschauen so müsste wohl aus z.B. jeweils 10 Werten ein Mittelwert gebildet werden der dann zur Anzeige kommt, oder?
0
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Ansatz zur Realisierung Multi-Line-Chart 
Autor: Manfred X
Datum: 25.01.18 14:01

Hallo!

Nochmal:
Eine Zeitreihe kann unterschiedliche Arten relevanter Information
enthalten. Schau Dir mal ein diesbezügliches Lehrbuch an.
Abhängig von der Art der Information, die visualisiert werden soll,
ist die Zeitreihe geeignet zu bearbeiten:
- Glättunsgverfahren oder Filterung der Daten (Grundverlauf)
- Anpassung an mathematische Trendmodelle
- Spektralanalyse (Schwingungen)
- Clusteranalyse (Identifikation sich wiederholender Saisonfiguren)
- autoregressive Modelle (Zeitreihen mit "Gedächtnis", Nachwirkungen)
- usw.

Für den Vergleich von Zeitreihen (Beziehungen) gibt es weitere Verfahren
(z.B. Kreuzkorrelations-Diagramme).

Durch Anwendung eines für die Daten/Zielsetzungen ungeeigneten Modells
werden Informationen eventuell verschleiert und das Diagramm verfälscht !!
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Ansatz zur Realisierung Multi-Line-Chart 
Autor: Dot
Datum: 26.01.18 07:12

Also nochmal,

es geht darum die Daten nur anzuzeigen!
Kein Verhgleich, keine Glättung, keine Spektralanalyse, ...!

Es sind nur mehr Daten in X-Richtung vorhanden die auf den Monitor physich angezeigt werden können.
D.h. es wird nur ein Ausschnitt dieser Daten angezeigt. Diesen Ausschnitt soll der User aber versieben können.

Was ist hier die Technik der Wahl? GDI, WPF, Writable Bitmap?
0
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Ansatz zur Realisierung Multi-Line-Chart 
Autor: Manfred X
Datum: 26.01.18 08:09

WPF bietet wesentlich effizientere Graphikoperationen
als das alte GDI+ ...

Damit für den User die Daten-Abfolge erkennbar ist, kannst Du
(HD-Auflösung) maximal etwa 400-500 Zeitreihen-Werte auf dem Display
anzeigen.

Der User stellt einen Startzeitpunkt ein und das Programm bestimmt dazu,
bis zu welchem Endzeitpunkt der Darstellungsbereich reicht
(500 * Zeit-Intervall zwischen Einzeldaten).
Die Daten innerhalb dieses Intervalls werden aus der Datenbank abgefragt
und angezeigt.

Aber Du wolltest Zoomen !
Für die Anzeige größerer Zeitintervalle benötigst Du geeignet aufbereitete
Daten - und dafür ist die Anwendung entsprechender Modelle erforderlich
(Glättung, Trend, Schwingung usw.).
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Ansatz zur Realisierung Multi-Line-Chart 
Autor: Franki
Datum: 27.01.18 01:47

Hallo,

Zitat:


es geht darum die Daten nur anzuzeigen!
Kein Verhgleich, keine Glättung, keine Spektralanalyse, ...!

Schon klar, aber du schreibst ja selbst im anderen Post:
Zitat:


Da die Aufzeichnung weit aus mehr Daten enthält als sinnvoll auf den Monitor angezeigt werden können, ist es notwendig die Daten sinnvoll für die Anzeige aufzubereiten. Möchte man den vollständigen zeitlichen Signalverlauf anschauen so müsste wohl aus z.B. jeweils 10 Werten ein Mittelwert gebildet werden der dann zur Anzeige kommt, oder?


Also bist du ja selbst davon überzeugt, dass etwas "passieren" muss mit den Daten je nach gewünschter Anzeige.

Zitat:


Es sind nur mehr Daten in X-Richtung vorhanden die auf den
Monitor physich angezeigt werden können.
D.h. es wird nur ein Ausschnitt dieser Daten angezeigt.
Diesen Ausschnitt soll der User aber versieben können.


Aber was der User dann sieht hängt ja von der Aufgabenstellung des Diagramms ab. Und genau danach richtet sich das was zu beim Zoom selbst machen musst.

Beispiel DAX: Jeden Tag sieht man Grafiken über den Verlauf des DAX bei diversen Nachrichtensendern im Fernsehen. Manchmal sind ist das ein Verlauf über ein paar Stunden (Mit Minutenentervall), einen Monat, ein Jahr oder sogar ein Jahrzehnt. Manchmal werden die Punkte angezeigt, manchmal die Prozentwerte, manchmal was ganz anderes.

Mit reinem grafischem Zoom kommst du da mit Sicherheit nicht weit, denn schon aus Perfomancegründen ist das nicht sinnvoll das über einen grafischen Zoom zu lösen, denn du müßtest immer die gesamte (sehr große Grafik mit dem dazugehörigen sehr großen Datenbestand laden)

Zitat:


Was ist hier die Technik der Wahl? GDI, WPF, Writable
Bitmap?


Meiner Meinung nach ist es bei solchen Datenmengen sinnvoll dem User anzubieten was er sehen möchte bzw. welches Intervall. Wie du darauf reagierst, Tastendruck, Mausklick, Menüauswahl usw. usw. bleibt dir überlassen, du musst nur darauf reagieren was der User möchte. Und wenn du dessen Wunch hast, dann die Daten des entsprechenden Bereichs neu laden und anzeigen. Wie das grafisch aufbereitet wird ist dann der zweite Schritt.

Und dann mußt du noch berücksichtigen, dass nicht jeder User die gleiche Auflösung sowohl von Monitor als auch Windows hat. Das kann wenn du dich nur darauf verlässt auch schief gehen. Auch bei solch großen Datenmengen kann es passieren dass der Rechner des Users nicht leistungsfähig genug ist und es "ewig" dauern kann bis etwas bzw. etwas anderes beim zoomen angezeigt wird. Nich jeder hat eine High-End PC, es kommen auch mal Tablets mit WIN zum Einsatz die nicht sonderlich leistungsfähig in solchen Sachen sind.

Gruß
Frank
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Beispiel: Explorativer Zeitreihenchart 
Autor: Manfred X
Datum: 27.01.18 10:07

Public Class frmTimeSeries
 
    Dim cht As New System.Windows.Forms.DataVisualization.Charting.Chart _
        With {.Parent = Me, .Dock = DockStyle.Fill}
 
 
    'generische Klasse für Zeitreihenwert 
    Private Class TimeValue(Of T As iComparable)
        Implements IComparable(Of TimeValue(Of T))
 
        Private _value As T
        Private _time As DateTime
 
        Private _min, _max As T
 
        Public Sub New(time As DateTime, value As T)
            _time = time
            _value = value : _min = value : _max = value
        End Sub
 
        Public ReadOnly Property GetTime() As DateTime
            Get
                Return _time
            End Get
        End Property
 
        Public ReadOnly Property GetValue() As T
            Get
                Return _value
            End Get
        End Property
 
        Public Property Max() As T
            Set(value As T)
                _max = value
            End Set
            Get
                Return _max
            End Get
        End Property
 
        Public Property Min As T
            Set(value As T)
                _min = value
            End Set
            Get
                Return _min
            End Get
        End Property
 
 
 
        Public Function CompareTo(other As TimeValue(Of T)) As Integer _
            Implements System.IComparable(Of TimeValue(Of T)).CompareTo
            Return _value.CompareTo(other.GetValue)
        End Function
    End Class
 
 
    Dim timeseries As New List(Of TimeValue(Of Double))
 
 
    Private Sub CreateRandomSeries()
 
        Dim rndm As New Random(12345)
        Dim tim As New DateTime(2000, 1, 1)
        For i As Integer = 1 To 50000
            tim = tim.AddMinutes(1)
            timeseries.Add _
                (New TimeValue(Of Double)(tim, rndm.NextDouble + i * 0.000005))
        Next i
    End Sub
 
 
    Private Sub frmTimeSeries_Load(sender As System.Object, _
                    e As System.EventArgs) Handles MyBase.Load
        CreateRandomSeries()
        Dim params As List(Of TimeValue(Of Double)) = _
            CreateTimeSeriesParams(timeseries.Count \ 200)
 
        CreateChart(params)
    End Sub
 
 
    Private Function CreateTimeSeriesParams(stepp As Integer) _
        As List(Of TimeValue(Of Double))
 
        Dim params, vl As New List(Of TimeValue(Of Double))
            For i As Integer = stepp \ 2 To _
                (timeseries.Count - 1) - stepp \ 2 Step stepp
 
                vl.Clear()
                For k As Integer = i - stepp \ 2 To i + stepp \ 2
                    vl.Add(timeseries(k))
                Next k
 
                vl.Sort()
 
                'Anzeigeparameter (Zeiteintrag: evt. als Intervallmitte)
                params.Add(vl(stepp \ 2))
                params(params.Count - 1).Max = vl(stepp \ 4).GetValue
                params(params.Count - 1).Min = vl(stepp \ 4 * 3).GetValue
            Next i
        Return params
    End Function
 
 
    Private Sub CreateChart(params As List(Of TimeValue(Of Double)))
 
        cht.ChartAreas.Clear()
        cht.Series.Clear()
        cht.ChartAreas.Add("Base")
        With cht.Series
            .Add("Values") : .Add("min") : .Add("max")
        End With
        With cht.Series("Values")
            For i As Integer = 0 To params.Count - 1
                .Points.AddXY(params(i).GetTime, params(i).GetValue)
            Next i
            .ChartType = DataVisualization.Charting.SeriesChartType.Line
        End With
        With cht.Series("min")
            For i As Integer = 0 To params.Count - 1
                .Points.AddXY(params(i).GetTime, params(i).Min)
                .ChartType = DataVisualization.Charting.SeriesChartType.Line
            Next i
        End With
        With cht.Series("max")
            For i As Integer = 0 To params.Count - 1
                .Points.AddXY(params(i).GetTime, params(i).Max)
                .ChartType = DataVisualization.Charting.SeriesChartType.Line
            Next i
        End With
 
        With cht.ChartAreas("Base")
            .AxisX.IntervalType = _
              DataVisualization.Charting.DateTimeIntervalType.Minutes
 
            .AxisY.Minimum = -0.2
            .AxisY.Maximum = 1.2
        End With
    End Sub
 
End Class


Beitrag wurde zuletzt am 27.01.18 um 10:14:06 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Beispiel: Explorativer Zeitreihenchart 
Autor: Manfred X
Datum: 27.01.18 11:31

Hallo Leute

Ich hoffe, ihr beherrscht die Operator-Vorrangregeln besser als ich !
(Multiplikation geht vor Ganzzahl-Division)

Hier eine überarbeitete Fassung der Routine "CreateTimeSeriesParams"
für gleichabständige Parameter (bei gleichabständigen Zeitreihen):
    Private Function CreateTimeSeriesParams(stepp As Integer) _
        As List(Of TimeValue(Of Double))
 
        Dim params, vl As New List(Of TimeValue(Of Double))
 
        For i As Integer = stepp \ 2 To _
              (timeseries.Count - 1) - stepp \ 2 Step stepp
 
            vl.Clear()
            For k As Integer = i - stepp \ 2 To i + stepp \ 2
                vl.Add(timeseries(k))
            Next k
            vl.Sort()
 
            Dim median As New TimeValue(Of Double)(timeseries(i).GetTime, _
                                        vl(stepp \ 2).GetValue)
            params.Add(median)
 
            params(params.Count - 1).Min = vl(stepp \ 4).GetValue
            params(params.Count - 1).Max = vl((stepp \ 4) * 3).GetValue
        Next i
        Return params
 
    End Function
Hinweis:
Explorative Charts erstellt man, wenn man über die Daten nichts näheres weiß
und mal reingucken will (Inspektion).
Bevorzugt wird dabei die Verwendung "robuster Kennwerte", auf deren Ausprägung
sich geringfügige Änderungen der zugrundeliegenden Daten nicht merkbar auswirken.
Im obigen Beispiel wird der Medianwert innerhalb eines Zeitabschnitts verwendet.
Zur (vorgeschalteten) Glättung der Zeitreihe kann man gleitende Mediane ermitteln.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel