none
Powershell Charts X-Achse sortieren RRS feed

  • Frage

  • Hallo zusammen,

    ich versuche mit Hilfe von MSChart ein Diagramm zu erstellen, leider gelingt es mir nicht die X-Achse passend zu sortieren. Die X-Achse des Diagramms enthält die Wochentage, die Y-Achse Werte zu den jeweigen Tagen Das sieht in etwa so aus:

    $week = @{Montag=$day1; Dienstag=$day2; Mittwoch=$day3; Donnerstag=$day4; Freitag=$day5; Samstag=$day6; Sontag=$day7; } 
    [void]$Chart.Series.Add("Data") 
    $Chart.Series["Data"].Points.DataBindXY($week.Keys, $week.Values)
    $Chart.Series["Data"].Sort([System.Windows.Forms.DataVisualization.Charting.PointSortOrder]::Descending, "X")
    $Chart.Series["Data"]["DrawingStyle"] = "Cylinder"

    Leider werden die Wochentage auf der X-Achse vertauscht. Ich habe schon herraus gefunden das es wohl daran liegt das ich bei $week einen Hashtable verwende der die Daten immer in beliebiger unsortierter Reihenfolge enthält. Gibt es eine Möglichkeit die Daten nach den Wochentagen zu sortieren?

    Ich bin um jeden Vorschlag dankbar.

    Gruss

    Frank

    Freitag, 13. April 2012 18:16

Antworten

  • Hashtables kann man auch ohne V3 problemlos sortieren, indem man einen Enumerator zuweist:
     

    	$hashobj = @{Montag=$day1; Dienstag=$day2; Mittwoch=$day3; Donnerstag=$day4; Freitag=$day5; Samstag=$day6; Sonntag=$day7;  }
    	
    	$hashobj.GetEnumerator()  | Sort-Object { $_.key}

     
    Eine einfache Sortierung nützt dir hier aber nichts, da es keine einfache Sortierung nach Wochentagen (ohne Datum) gibt.

    Du kannst nach Zahlen, dem Alphabet oder auch Daten (Datum) sortieren. Wenn du also statt Wochentagen zumindest bei der Datenerhebung das Datum benutzt, könnte man danach sortieren und im Chart dann trotzdem nur den Wochentag angeben, falls gewünscht.

    Das sähe dann mit Beispieldaten z.b. so aus:
     

    	$hashobj = @{ "9.4"="56"; "10.4" ="76";  "11.4"="45";  "12.4"="56";  "13.4"="34";  "14.4"="98";  "15.4"="44";  }  
    	$hashobj.GetEnumerator()  | Sort-Object { get-date $_.key} | ForEach-Object { $chart.Series["Data"].Points.addxy( (Get-Date $_.Key -Format dddd),$_.value) } 
     
    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".

    Montag, 16. April 2012 11:56
    Moderator

Alle Antworten

  • Sortierte Hashs gibt est erst in der PowerShell V3
    Zur Zeit (V1,V2) musst du dir mit einer Array Krücke behelfen, da Arrays Ihre reihenfolge behalten:

    $WeekDaysKeys = @('Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag', 'Sontag') 
    $WeekDaysValues = @($day1, $day2, $day3, $day4, $day5, $day6, $day7)
    
    [void]$Chart.Series.Add("Data") 
    $Chart.Series["Data"].Points.DataBindXY($WeekDaysKeys, $WeekDaysValues)
    $Chart.Series["Data"].Sort([System.Windows.Forms.DataVisualization.Charting.PointSortOrder]::Descending, "X")
    $Chart.Series["Data"]["DrawingStyle"] = "Cylinder"


    Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '


    Montag, 16. April 2012 07:56
  • Hashtables kann man auch ohne V3 problemlos sortieren, indem man einen Enumerator zuweist:
     

    	$hashobj = @{Montag=$day1; Dienstag=$day2; Mittwoch=$day3; Donnerstag=$day4; Freitag=$day5; Samstag=$day6; Sonntag=$day7;  }
    	
    	$hashobj.GetEnumerator()  | Sort-Object { $_.key}

     
    Eine einfache Sortierung nützt dir hier aber nichts, da es keine einfache Sortierung nach Wochentagen (ohne Datum) gibt.

    Du kannst nach Zahlen, dem Alphabet oder auch Daten (Datum) sortieren. Wenn du also statt Wochentagen zumindest bei der Datenerhebung das Datum benutzt, könnte man danach sortieren und im Chart dann trotzdem nur den Wochentag angeben, falls gewünscht.

    Das sähe dann mit Beispieldaten z.b. so aus:
     

    	$hashobj = @{ "9.4"="56"; "10.4" ="76";  "11.4"="45";  "12.4"="56";  "13.4"="34";  "14.4"="98";  "15.4"="44";  }  
    	$hashobj.GetEnumerator()  | Sort-Object { get-date $_.key} | ForEach-Object { $chart.Series["Data"].Points.addxy( (Get-Date $_.Key -Format dddd),$_.value) } 
     
    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".

    Montag, 16. April 2012 11:56
    Moderator
  • Das funktioniert super. Vielen Dank!

    Gruss, Frank

    Montag, 16. April 2012 18:47
  • Hallo, das Beispiel habe ich nicht ans Laufen bekommen. Ich denke ich hab da irgendwo einen Denkfehler. Mit der Methode oben funktioniert es aber super. Vielen Dank trotzdem :-)
    Montag, 16. April 2012 18:49
  • > das Beispiel habe ich nicht ans Laufen bekommen. Ich denke ich hab da irgendwo einen Denkfehler.

    Ich habs getestet, kann also nur ne Kleinigkeit sein.

    Wichtig ist aber vor allem sich zu merken, das man Hashtables durchaus einfach sortieren kann. Wenn du nämlich mal Hashtables mit 50 oder 500 Werten hast, ist der Umbau in einfache Arrays nicht nur sehr aufwändig sondern u.u auch speicherintensiv.

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".

    Montag, 16. April 2012 18:59
    Moderator
  • Danke für den Heinweis, ich habe es noch einmal ausprobiert, jetzt funktionierts :-)
    Montag, 16. April 2012 20:02