X-Achse als Zeitachse

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    X-Achse als Zeitachse

    Hallo an alle,ich habe ein Chart mit einer ChartArea, auf der ich mehrere Series darstelle. Die X-Achse stellt die Zeit dar. Momentan stelle ich numerische Werte eines Tages da. Auf der X-Achse werden die vollen Stunden von 0 bis 24 angezeigt. Kann man es auch mit mehr als einem Tag hinbekommen, dass ich auf der X-Achse bei einem Tageswechsel das Datum habe und zwischen den Tageswechseln jeweils die volle Stunde? Ich habe nichts dergleichen im Internet gefunden.

    Ruhrprinz schrieb:

    Die X-Achse stellt die Zeit dar.
    Das geht so:

    VB.NET-Quellcode

    1. Chart1.ChartAreas(0).AxisX.LabelStyle.Format = "dd.MM.yyyy" ' Datunsformat
    2. Chart1.ChartAreas(0).AxisX.LabelStyle.Angle = 45 ' Neigung des Beschriftungstextes in °
    Probiere auch diese Datums-Formate:

    Quellcode

    1. MMM
    2. MMMM
    3. dd.MM.yyyy
    4. MM.yyyy
    5. MMM.yyyy
    6. MMMM.yyyy
    7. MM.yy

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Vielen dank, ich erkläre es noch einmal. Ich habe hunderte numerische Werte zu jeweils einem Zeitpunkt, z.B.:

    23.11.2014 08:14 122
    23.11.2014 08:22 124
    23.11.2014 08:25 123
    23.11.2014 08:35 132
    .
    .
    .
    24.11.2014 22:24 165

    Auf der X-Achse soll die erste Spalte (Zeitpunkte) dargestellt werden. Die Y-Achse stellt die numerischen Werte in der zweiten Spalte dar. Die X-Achse mit den Zeitpunkten soll z.B. bei 23.11..2014 12:00 beginnen und bei 24.11.2014 12:00 enden. Wenn ein Tag beginnt (hier 24.11.2014 00:00 soll die Achsenbeschriftung "24.11.2014" anzeigen. Zwischen diesen "vollen Tagen" sollen die vollen Stunden (1, 2, 3, ... ,23) dargestellt werden.

    Ruhrprinz schrieb:

    die vollen Stunden
    Da musst Du die Achs-Teilung der x-Achse entsprechend vorgeben:

    VB.NET-Quellcode

    1. Me.Chart1.ChartAreas(0).AxisX.Maximum = 100
    2. Me.Chart1.ChartAreas(0).AxisX.Minimum = 0
    3. Me.Chart1.ChartAreas(0).AxisX.Interval = 24 ' diesen Wert musst Du bei DateTime halt ausprobieren
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    So etwas habe ich ja eingestellt. Ich stelle ja jetzt die vollen Stunden dar. Ich nehme aus dem Zeitpunkt nur die Uhrzeit und rechnet die mit

    Zeit..ToOADate() * 24

    um.

    Ich will aber zusätzlich zum Tagesbeginn das Datum sehen. Die X-Achse soll auch von 12 Uhr des ersten bis 12 Uhr des zweiten Tages gehen. Dann würde das Datum in der Mitte der X-Achse stehen, davor 12, 13, ... 23 und dahinter 1, 2, 3....Wenn ich die Zeit abschneide, dann liegen die Werte der beiden halben Tage natürlich übereinander. Es wird also erforderlich sein, dass ich den Zeitpunkt komplett nehme. Ich wäre auch einigermaßen zufrieden, wenn es nur so geht, dass auch das Datum jedesmal mit angezeigt wird.

    Ich habe mal von oben das hier eingefügt:

    Chart1.ChartAreas(0).BackColor = System.Drawing.Color.FromArgb(255, 0, 0)
    Chart1.Titles(0).DockedToChartArea = 0
    Chart1.Titles(0).Font = New Font("Arial", 10, FontStyle.Bold)
    Chart1.ChartAreas(0).AxisX.Minimum = 0
    Chart1.ChartAreas(0).AxisX.Maximum = 24
    Chart1.ChartAreas(0).AxisX.Title = "Uhrzeit"
    Chart1.ChartAreas(0).AxisX.TitleAlignment = StringAlignment.Near
    Chart1.ChartAreas(0).AxisX.LabelStyle.Font = New Font("Arial", 8)
    Chart1.ChartAreas(0).AxisX.Interval = 1
    Chart1.ChartAreas(0).AxisX.LabelStyle.Format = "dd.MM.yyyy HH:mm"
    Chart1.ChartAreas(0).AxisX.LabelStyle.Angle = 45

    Die Liniengrafik wird dann so erzeugt:

    For Each row As DataRow In dt.Rows
    x = Rechts(row("Zeitpunkt"), 8)
    Chart1.Series(0).Points.AddXY(x.ToOADate() * 24, Val(row("Wert)))
    Next

    Rechts() liefert die letzten 8 Zeichen (den Zeitanteil) des Zeitpunktes zurück.

    Der Zeitpunkt kommt aus einer Datenbank und hat dieses Format:

    #11/24/2014 12:09:00 AM#

    Angezeigt wird jetzt:

    ddMMyyyy HH:mm
    dd1MMyyyy HH:mm
    dd2MMyyyy HH:mm

    usw.

    Ruhrprinz schrieb:

    und rechnet die mit
    Zeit..ToOADate() * 24
    um.
    ÜBEZEUGE DICH DAVON, was da für Werte rauskommen, ich nehme mal an, dass da Müll rauskommt.
    Gib der x-Achse des Charts das Format DateTime.
    Du kannst mit Datumsen rechnen wie mit Zahlen!
    Bilder
    • Dat1.jpg

      8,9 kB, 480×171, 512 mal angesehen
    • Dat2.jpg

      6,63 kB, 460×115, 552 mal angesehen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Da kommen korrekte Werte zwischen 0 und 1 heraus. Mit der Zeit ist das kein Problem. Die Darstellung eines Tages nur mit der Zeit klappt ja schon lange. Was muss ich aber für Proberties setzen, wenn ich das über mehrere Tage laufen lassen will, und ich beim Tageswechsel das Datum "DD.MM.YYYY" und dazwischen nur die Uhrzeiten "01:00", "02,00" usw. haben möchte.

    Geht das nicht????

    Ruhrprinz schrieb:

    Was muss ich aber für Proberties setzen

    RodFromGermany schrieb:

    Gib der x-Achse des Charts das Format DateTime.
    Bilder
    • Series.jpg

      49,97 kB, 595×583, 593 mal angesehen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ok, ich habe an etlichen Stellen nachgebessert und jetzt sieht das Chart annähernd so aus, wie ich es möchte. Besten Dank bis hier hin.

    Ich habe drei ChartAreas übereinander und durch das schräge Datum an den X-Achsen sind jetzt alle ChartAreas höhenmässig zu sehr zusammengedrückt. Kann man dem Chart sagen, dass es eine vertikale Scrollbar anzeigen soll? Wenn das geht, dann schreib mir bitte wie.

    Ruhrprinz schrieb:

    dann schreib mir bitte wie.
    Eine Idee, ungetestet:
    Pack das Chart-Control in ein Panel und gib diesem die Property AutoScroll = True.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Leider negativ. Ich habe folgendes gesetzt:

    Private Sub frmChart_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    Panel1.VerticalScroll.Visible = True
    Chart.Height = Panel1.Height * 1.5

    End Sub

    Chart.Height wird aber nicht verändert.

    Ich habe dann mal bei dem Chart "Dock" auf None gesetzt und das hier gemacht:

    Private Sub frmChart_Resize(sender As Object, e As EventArgs) Handles MyBase.Resize

    Panel1.Width = Me.Width
    Panel1.Height = Me.Height
    chart.Width = Panel1.Width
    chart.Height = Panel1.Height * 1.5

    End Sub

    Dann sieht das schon viel besser aus.

    ABER

    Es stört mich noch immer die Beschriftung der X-Achse.

    Kann man es irgendwie hinbekommen, dass das volle Datum nur bei 0:00 Uhr angezeigt wird und ansonsten immer nur die Zeit?
    Bilder
    • X-Achse.JPG

      35,54 kB, 1.302×174, 632 mal angesehen

    Ruhrprinz schrieb:

    ansonsten immer nur die Zeit?
    Nein.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich habe schon an CustomLabels gedacht, aber beim Versuch, ein CustomLabel mit Add zu ergänzen, hat sich das Programm aufgehängt. Man findet im I-Net so gut wie keine vernünftigen Beispiele für so etwas. Wie kann ich die Standardlabels ausblenden und dafür CustomLabels generieren? Kann man nicht auch alternativ die Standardlabels nachträglich bearbeiten? Gibt es da eine Collection, die ich durchlaufen kann?

    Ruhrprinz schrieb:

    hat sich das Programm aufgehängt.
    Mit welchem Code?
    ----------------------------------
    Sieh Dir mal dies an:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Chart1.ChartAreas(0).AxisX.LabelStyle.Angle = 45
    3. For i = 0 To 100 Step 10
    4. Dim label1 As CustomLabel
    5. Select Case i
    6. Case 30, 60, 90
    7. label1 = New CustomLabel(i - 1, i + 1, String.Format("{0:00000}", i), 0, LabelMarkStyle.None)
    8. Case Else
    9. label1 = New CustomLabel(i - 1, i + 1, String.Format("""{0:00}""", i), 0, LabelMarkStyle.None)
    10. End Select
    11. Chart1.ChartAreas(0).AxisX.CustomLabels.Add(label1)
    12. Next
    13. End Sub

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

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