| |
VB.NET - Ein- und UmsteigerAnsatz 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 | |
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. | |
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 | |
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. | |
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 | |
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 | |
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 !! | |
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 | |
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.). | |
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 | |
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. | |
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. | |
| 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 |
|
|
vb@rchiv CD Vol.6 vb@rchiv Vol.6
Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
Online-Update-Funktion Entwickler-Vollversionen u.v.m.Jetzt zugreifen Tipp des Monats sevAniGif (VB/VBA)
Anzeigen von animierten GIF-Dateien
Ab sofort lassen sich auch unter VB6 und VBA (Access ab Version 2000) animierte GIF-Grafiken anzeigen und abspielen, die entweder lokal auf dem System oder auf einem Webserver gespeichert sind. Weitere Infos
|