Chart Control - Ein Balken pro Datensatz anzeigen

  • VB.NET

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von iOS78.

    Chart Control - Ein Balken pro Datensatz anzeigen

    Hallo zusammen!

    Ich möchte gerne in einem Balkendiagramm Messwerte anzeigen lassen. Die X-Achse ist die Zeitachse. Es können mehrere Messwerte pro Minute anfallen. Ist es möglich, ein Balkendiagramm so einzustellen, dass pro Messwert 1 Balken gezeichnet wird?

    So wie es im Moment ist, wird nur der höchste Messwert als Balken dargestellt.

    Danke schon mal.....
    Bilder
    • Sreenshot.jpg

      145 kB, 1.908×830, 383 mal angesehen
    Hi @iOS78,

    ist das das Chart-Control von Microsoft oder ein 3rd-Party Control?

    Wie erstellst du deine Chart-Series?

    iOS78 schrieb:

    ​So wie es im Moment ist, wird nur der höchste Messwert als Balken dargestellt.


    warum benutzt du kein z.B. stacked Columnchart?



    LG Mausekeks
    Brain is Loading: 35%
    Hi @mausekeks!

    Hier der Code:

    VB.NET-Quellcode

    1. Public Sub FilterData(valueToSearch As String)
    2. Dim searchQuery As String = "SELECT * FROM Table_02_Wasserwerte WHERE Test='GH' OR Test='GH sensitive' "
    3. Dim command As New SqlCommand(searchQuery, connection)
    4. Dim adapter As New SqlDataAdapter(command)
    5. Dim table As New DataTable()
    6. adapter.Fill(table)
    7. Chart1.DataSource = table
    8. Dim Series1 As Series = Chart1.Series("GH")
    9. Dim Series2 As Series = Chart1.Series("GH sensitive")
    10. Series1.Name = "GH"
    11. Series2.Name = "GH sensitive"
    12. Chart1.Series(Series1.Name).XValueMember = "Datetime"
    13. Chart1.Series(Series1.Name).YValueMembers = "Value"
    14. Chart1.Series(Series2.Name).XValueMember = "Datetime"
    15. Chart1.Series(Series2.Name).YValueMembers = "Value_sensitive"
    16. Chart1.DataBind()
    17. End Sub
    @iOS78 Natürlich geht das.
    Die Datatable hat bei mir für n Reihen folgendes Format mit 1+n Spalten: Zeit, Wert, Wert, ... usw. Die Spalte mit der Zeit heißt bei mir zwingend "Intervall", änder also deine Spaltenbezeichnung ebenso, oder ändere die Bezeichnung der Spalte in der Sub. Die Sub benutze ich so wie hier reinkopiert, übergib einfach die entsprechende Datentabelle und das Chartcontrole.

    VB.NET-Quellcode

    1. Private Sub RefreshChartBalken(ByRef dt As DataTable, Diagramm As Chart))
    2. With Diagramm
    3. .Series.Clear()
    4. .DataSource = dt
    5. For Each col As DataColumn In dt.Columns
    6. 'Spalte "Intervall" (idR erste Spalte) überspringen
    7. If col.ColumnName = "Intervall" Then Continue For
    8. 'Komma in Spaltenbezeichnung entfernen. Chart-Steuerelement schmiert sonst ab
    9. If col.ColumnName.Contains(","c) Then col.ColumnName = col.ColumnName.Replace(","c, String.Empty)
    10. With .Series.Add(col.ColumnName)
    11. .ChartType = DataVisualization.Charting.SeriesChartType.Column
    12. .YValueType = DataVisualization.Charting.ChartValueType.Auto
    13. .YValueMembers = col.ColumnName
    14. .XValueMember = "Intervall"
    15. End With
    16. Next
    17. End With
    18. End Sub


    Den Charttype kannst du auch auf StackedColumn stellen, wenn das deinem Zweck dienlicher ist.
    Hi @Narretei!

    Danke für den Code!
    Hab es eben mal auf die Schnelle getestet, allerdings brachte es auch nicht den gewünschten Erfolg.

    Werte, die z.B. um 13:30:15, 13:30:40, 13:30:55 gespeichert wurden, werden in einen Balken gestopft.
    nur der Geösste Wert wird dargestellt!
    Hi @Narretei!

    Habe es eben nochmal mit einer „frischen“, unbefleckten Form/Chart getestet.
    es funktioniert. Das Problem der Darstellung ist die Skalierung, welche ich aber auch nicht in den Griff bekomme.
    Angehängter Screenshot zeigt das Chart mit ca. 20 Datensätzen, aufgezeichnet in einem Zeitraum von ca. 30 Minuten.
    ich bekomme einfach keine vernünftige Skalierung hin, dass z.B lediglich ein Zeitraum von einer Stunde angezeigt wird und die Balken dann dementsprechend satter rüberkommen.....
    Bilder
    • 281F0763-EE70-4287-B1B5-A62D59DB878E.png

      39,31 kB, 1.366×768, 391 mal angesehen
    Die Darstellung sieht für mich korrekt aus, auch anhand von dem was ich von deinen Daten da so sehe. Das "Problem" ist, dass deine Daten nur sehr unregelmäßig zu kommen scheinen.

    ​Hört sich doof an, aber: mal einfach mal was du willst. Auf Papier oder in Paint etc. Dann überleg dir, wie du die Daten so abfragen ODER bearbeiten kannst, dass die Funktion dir das gibt, was du willst. Gegebenenfalls ist dabei ein Zeitstempel für dich völlig unerheblich, weil du z.B. 2 Messreihen vergleichen willst, unabhängig davon wann diese durchgeführt wurden.

    ​Wenn du dann nicht weiterkommst helfe ich gerne.
    Hi @Narretei!

    Danke, dass Du mir zumindest bestätigt hast, dass soweit alles mit rechten Dingen zugeht!

    Also eigentlich hast Du Recht, der Zeitstempel ist „erstmal“ uninteressant.

    Interessant wird er erst bei anderen Auswertungen, die aber nicht visualisiert werden sollen.

    Für diesen Fall habe ich mir jetzt überlegt, dass man die Timestamps durchnummeriert und diese Nummerierung dann als Wert für die X-Achse nutzt. Dann sollten die Balken ja nebeneinander dargestellt werden, oder?

    Wie ich das machen soll ist mir aber schleierhaft.....

    Würde ein einfaches durchnummerieren der einzelnen Messwerte in der SQL Datenbank reichen, auch wenn man nach einem Datumsbereich mittendrin filtert?

    Also z.B.: Der 1. Datensatz wird am 01.01. aufgezeichnet und mit “1“ nummeriert.

    Der Letzte am 31.12 mit der fortlaufenden Nummer 100.

    Wenn ich jetzt für den Datumsbereich Januar - Februar eine Grafik erstellen möchte mit dem Nummernbereich 30-50, würden diese Daten dann auch nebeneinander dargestellt werden, oder muss ich für jede Abfrage neu von 1 - .... durchnummerieren?

    VG & Danke!
    (ich guck nur alle paar Tage mal rein, daher jetzt erst die Antwort)

    ​@iOS78 das hängt ganz davon ab, was du willst =/ das kann ich dir nicht vorgeben. Ich würde wenn überhaupt den Datensätzen Zahlen in der Abfrage verpassen, die aber nicht mit in der DB speichern. Oder du hast irgend einen anderen logischen Bezug. Du brauchst quasi irgendwas was Messung A von Gerät 1 mit Messung B von Gerät 2 miteinander logisch verbindet. Die Balken werden auf jeden Fall dann zusammenstehend dargestellt, wenn die x-Koordinate gleich ist. Übergibste garnix als x-Korrdinate, wird einfach durchgezählt pro Serie
    Hallo @Narretei!

    Cool, dass Deine Geduld noch nicht am Ende ist..... :thumbsup:

    Ich war in den letzten Tagen auch nicht untätig und habe es jetzt so, wie ich es wollte. An Deinem Code habe ich bis jetzt festgehalten, nur den XValue-Member habe ich auf "" gesetzt, damit er mir alle Balken schön brav nebeneinander setzt.
    Ich habe mir überlegt, dass ich mit einem Tooltip arbeite, damit ich - falls die Masse der Balken mal Überhand nimmt - den Punkt zuordnen kann. Den Y-Wert bekomme ich angezeigt, allerdings hätte ich schon gerne den kompletten Datensatz (Zeitstempel & YWert) als Tooltip-Anzeige.

    Es wäre cool, wenn Du mir vielleicht hier einen Denkanstoss geben könntest. ISt es überhaupt möglich, das Datum in eine ToolTip-Anzeige zu integrieren, wenn der Datumswert im Chart eigentlich nicht benutzt wird? Mann müsste den Y-zugehörigen Datensatz dann ja irgendwie aus dem Dataset holen??? Stehe seit 2 Tagen total auf dem Schlauch und finde nichts brauchbares im Netz......


    Danke auf jeden Fall schon mal bis hierhin!
    Bilder
    • Screenshot.png

      46,97 kB, 1.292×512, 476 mal angesehen
    Du könntest zum einen ein Datum in einen String konvertieren und DAS dann als x-wert reingeben im Chart. Das könnte gehen. Mit Tooltips im Chart hab ich mich noch nicht beschäftigt, ich melde mich wenn ich was lauffähiges hab.

    ​EDIT: ekliger als gedacht. Das funktioniert augenscheinlich echt nur über Schlüsselworte. Hier mal eine Tabelle dazu: msdn.microsoft.com/en-us/library/dd456687.aspx

    ​Weitere Quelle: blogs.msdn.microsoft.com/alexg…h-content-using-keywords/

    ​Ich würde das wie oben beschrieben lösen. Optional einfach mal nen Schritt zurücktreten und gucken ob das, was du mir beschrieben und das, was du programmiert hast, auch das ist was du haben willst oder tun sollst. Oder ob es vielleicht einen anderen weg gibt. Das kann ich aber nicht beurteilen, dafür hab ich zu wenig Infos. Auf deinem Bild ist übrigens nur eine Series, nicht mehrere wie du es ursprünglich wolltest.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Narretei“ ()

    hast du dafür .YValueType = DataVisualization.Charting.ChartValueType.auto zu .YValueType = DataVisualization.Charting.ChartValueType.String geändert? oben gabs noch nen edit

    edit: probier mal als tooltip =​#CUSTOMPROPERTY(customAttributeName). Da müsstest du aber für JEDEN punkt das händisch setzen und irgendwie reinmorkeln was du willst.
    Ich hab das bei mir jetzt auch ein bisschen hübsch gemacht.

    VB.NET-Quellcode

    1. Private Sub RefreshBalken(ByRef dt As DataTable, Diagramm As Chart)
    2. With Diagramm
    3. .Series.Clear()
    4. .DataSource = dt
    5. For Each col As DataColumn In dt.Columns
    6. 'Spalte "Intervall" (idR erste Spalte) überspringen
    7. If col.ColumnName = "Intervall" Then Continue For
    8. 'Komma in Spaltenbezeichnung entfernen. Chart-Steuerelement schmiert sonst ab
    9. If col.ColumnName.Contains(","c) Then col.ColumnName = col.ColumnName.Replace(","c, String.Empty)
    10. With .Series.Add(col.ColumnName)
    11. .ChartType = DataVisualization.Charting.SeriesChartType.StackedColumn
    12. .YValueType = DataVisualization.Charting.ChartValueType.Auto
    13. .YValueMembers = col.ColumnName
    14. .XValueMember = "Intervall"
    15. .ToolTip = col.ColumnName & EinString & "#AXISLABEL" & ": " & "#VALY{N}" & EinAndererString
    16. End With
    17. Next
    18. .Annotations.Clear()
    19. Dim CreationStamp As New TextAnnotation
    20. With CreationStamp
    21. .Name = "CreationStamp"
    22. .AnchorAlignment = ContentAlignment.BottomRight
    23. .AnchorX = 99
    24. .AnchorY = 100
    25. .Text = DateTime.Now.ToString & " | " & UserName & ": " & dtpBeginn.Value.ToShortDateString & " - " & dtpEnde.Value.ToShortDateString & " | " & Werbetext
    26. End With
    27. .Annotations.Add(CreationStamp)
    28. End With
    29. End Sub


    Dadurch hab ich bei mehreren Serien immer ne x-Koordinate als ToolTip. Außerdem sieht man gleich wie ich Annotations einfüg, vielleicht interessierts ja ma wen.
    Hallo @Narretei!

    Sehr cool, hab es jetzt zumindest schon einmal in einem Testprogramm so hinbekommen, dass mir der Tooltip den Datenpunkt, Datum und dazugehörigen Wert anzeigt.
    Um die großen Abstände der Balken im Chart zu umgehen, kombiniere ich die ID-Spalte mit der Datum-Spalte der Tabelle und schreibe in eine neue Spalte "Combi". Den X-Wert setzte ich dann auf "Combi".

    VB.NET-Quellcode

    1. cmd.CommandText = "UPDATE Table_02_Wasserwerte SET Combi = CONCAT(ID,' | ', Datetime)"


    Womit wir zu einem Schönheitsproblem kommen: Das Datum wird mir nicht "sauber" im Format "dd.MM.yyyy HH:mm:ss" angezeigt sonder wie auf dem Bild zu sehen! :(
    Besteht die Möglichkeit beim Update der Tabelle ein Format vorzugeben?

    UPDATE!!!

    VB.NET-Quellcode

    1. cmd.CommandText = "UPDATE Table_02_Wasserwerte SET Combi = CONCAT(ID,' | ', Convert(varchar(MAX), Datetime, 104), ' - ', Convert(varchar(MAX), Datetime, 108), ' Uhr', ' - ', 'Messwert')"


    Vielleicht nicht die eleganteste Lösung, aber es funktioniert! ;)

    Vielen Dank nochmal @Narretei!


    VG

    Ingo
    Bilder
    • Tooltip_Test.jpg

      139,43 kB, 1.366×768, 508 mal angesehen
    • Tooltip_01 Kopie.jpg

      40,36 kB, 460×277, 381 mal angesehen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „iOS78“ ()