none
Powershell und Charts - Wie kann ich die Columns manuell einfärben? RRS feed

  • Frage

  • Ich habe eine CSV Datei, die ich erstmal einlese. Dort steht sowas drin wie:

    0-10%;4
    11-20%;23
    21-30%;83
    ...etc...
    91-100%;5

    Jetzt versuche ich mit diesen Werten ein Chart zu erstellen

       [void]$chart2.Series.Add("CPU")
       $chart2.Series["CPU"].ChartType = "Column"
       $chart2.Series["CPU"].BorderWidth  = 3
       $chart2.Series["CPU"].IsVisibleInLegend = $true
       $chart2.Series["CPU"].chartarea = "ChartArea1"
       $chart2.Series["CPU"].color = [System.Drawing.Color]::Green
       $i = 0
       do {
       $chart2.Series["CPU"].Points.addxy( $CIQ_Report[$i].'CPU Range', $CIQ_Report[$i].'Host Systems')
       $i++
       }
       while ($i -le 11)

    Wenn ich mir den Chart so anschaue, dann klappt das auch einwandfrei.

    Jetzt möchte ich die ersten 6 Columns (also von 0 - 60%) in grün haben, den Bereich 61 - 90% in gelb und den Bereich 91 - 100% in rot.

    Ich habe schon in verschiedenen Forum gesehen, dass man mit FindMaxByValue (siehe Script) den größten Wert findet und den Rot markiert:

    $maxValuePoint = $chart2.Series["CPU "].Points.FindMaxByValue()
    $maxValuePoint.Color = [System.Drawing.Color]::Red

    Aber ich möchte nicht den MaxByValue rot markieren der die meisten Values hat.

    Kann mir da einer helfen?



    Mittwoch, 22. Mai 2013 07:52

Antworten

  • Hi Benjamin,

    danke für den Code. Damit kann man was anfangen ;-)

    Das sollte funktionieren...

    foreach($DataPoint in $CIQ_Report)
    {
        $Point = $chart2.Series["Memory"].Points.addxy( $DataPoint.'CPU Range', $DataPoint.'Host Systems')
        if ($DataPoint.'CPU Range' -eq "90 - 100%")
    	{
    		$chart2.Series["Memory"].Points[$Point].Color = [System.Drawing.Color]::Red
    	}
    	else
    	{
    		$chart2.Series["Memory"].Points[$Point].Color = [System.Drawing.Color]::Green
    	}
    }
    Gruß Malte
    Mittwoch, 22. Mai 2013 14:09

Alle Antworten

  • Hi Bejamin,

    ich denke du beziehst dich auf folges tutorial: http://bytecookie.wordpress.com/2012/04/13/tutorial-powershell-and-microsoft-chart-controls-or-how-to-spice-up-your-reports/ das ich finde ich wichtig denn aus dem Stand weist man erst einmal nicht um was es wirklich geht. ;-)

    Als Beispiel hier mal ein ein schnippsel wie es gehen sollte... allerdings musst du diesen noch mal entsprechend anpassen

    foreach($Data in $Datas)

    {

    $Point = New-object System.Windows.Forms.DataVisualization.Charting.DataPoint($Data.Value,$Data.Name)

    if($Data.Value -le 60)

    {

    $Point.Color = [System.Drawing.Color]::Green

    }

    else

    {

    $Point.Color = [System.Drawing.Color]::Red

    }

    $chart2.Series["CPU"].Points.Add($Point)

    }

    Gruß Malte



    Mittwoch, 22. Mai 2013 08:42
  • Hi Malte, 

    das war nicht unbedingt der Link worauf ich mich bezog :) Habe mal mein Script aufgeräumt, damit ich das hier posten kann. Habe versucht mit dem DataPoint was zu machen, aber irgendwie steh ich mit Charts auf Kriegsfuss. Hier der Inhalt der Datei C:\temp\test\CIQ_Report.csv:

    "CPU Range","Host Systems"
    "0 - 10%","69"
    "10 - 20%","40"
    "20 - 30%","37"
    "30 - 40%","33"
    "40 - 50%","0"
    "50 - 60%","0"
    "60 - 70%","0"
    "70 - 80%","0"
    "80 - 90%","0"
    "90 - 100%","0"
    
    "Memory Range","Host Systems"
    "0 - 10%","9"
    "10 - 20%","6"
    "20 - 30%","17"
    "30 - 40%","27"
    "40 - 50%","23"
    "50 - 60%","53"
    "60 - 70%","21"
    "70 - 80%","23"
    "80 - 90%","0"
    "90 - 100%","0"
    
    "Disk Space Range","Host Systems"
    "0 - 10%","168"
    "10 - 20%","5"
    "20 - 30%","0"
    "30 - 40%","1"
    "40 - 50%","0"
    "50 - 60%","1"
    "60 - 70%","0"
    "70 - 80%","2"
    "80 - 90%","0"
    "90 - 100%","2"
    

    Und hier der Script dazu (C:\temp\test\Report.ps1)

    [void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms.DataVisualization")
    $scriptpath = Split-Path -parent $MyInvocation.MyCommand.Definition
    
    $CIQ_Report = Import-Csv C:\temp\test\CIQ_Report.csv
    
    $chart2 = New-object System.Windows.Forms.DataVisualization.Charting.Chart
    $chart2.Width = 800
    $chart2.Height = 500
    $chart2.BackColor = [System.Drawing.ColorTranslator]::FromHtml("#e5e5e5")
    
    [void]$chart2.Titles.Add("Hosts - Memory")
    $chart2.Titles[0].Font = "Arial,13pt"
    $chart2.Titles[0].Alignment = "topLeft"
    
    $chartarea2 = New-Object System.Windows.Forms.DataVisualization.Charting.ChartArea
    $chartarea2.Name = "ChartArea1"
    $chartarea2.AxisY.Title = "Host Systems"
    $chartarea2.AxisX.Title = "Range"
    $chartarea2.AxisY.Interval = 2
    $chartarea2.AxisX.Interval = 1
    $chart2.ChartAreas.Add($chartarea2)
    
    [void]$chart2.Series.Add("Memory")
    $chart2.Series["Memory"].ChartType = "Column"
    $chart2.Series["Memory"].BorderWidth  = 3
    $chart2.Series["Memory"].IsVisibleInLegend = $true
    $chart2.Series["Memory"].chartarea = "ChartArea1"
    $chart2.Series["Memory"].color = "#E3B64C"
    $i = 12
    do {
    	$Point = New-object System.Windows.Forms.DataVisualization.Charting.DataPoint($CIQ_Report[$i].'CPU Range', $CIQ_Report[$i].'Host Systems')
    	if ($CIQ_Report[$i].'CPU Range' -contains "90 - 100%")
    	{
    		$Point.Color = [System.Drawing.Color]::Red
    	}
    	else
    	{
    		$Point.Color = [System.Drawing.Color]::Green
    	}
    	$chart2.Series["Memory"].Points.Add($Point)
    	$i++
    }
    while ($i -le 21)
    
       
    $chart2.SaveImage("$scriptpath\SplineArea2.png","png")
    

    Evtl. bin ich da auch zu kompliziert :)

    Mittwoch, 22. Mai 2013 12:38
  • Hi Benjamin,

    danke für den Code. Damit kann man was anfangen ;-)

    Das sollte funktionieren...

    foreach($DataPoint in $CIQ_Report)
    {
        $Point = $chart2.Series["Memory"].Points.addxy( $DataPoint.'CPU Range', $DataPoint.'Host Systems')
        if ($DataPoint.'CPU Range' -eq "90 - 100%")
    	{
    		$chart2.Series["Memory"].Points[$Point].Color = [System.Drawing.Color]::Red
    	}
    	else
    	{
    		$chart2.Series["Memory"].Points[$Point].Color = [System.Drawing.Color]::Green
    	}
    }
    Gruß Malte
    Mittwoch, 22. Mai 2013 14:09
  • Hi Benjamin,

    hatte das so funktioniert wie du dir das vorgestellt hast? :-)

    Gruß Malte

    Donnerstag, 30. Mai 2013 12:50
  • Hi Malte,

    du hast mir den richtigen Weg gezeigt. Ich wusste nicht, dass man mit .Points den einzelnen Wert ansprechen kann. Somit ist jetzt dashier rausgekommen (Mit der CSV Datei wie oben beschrieben):

    $scriptpathBM = Split-Path -parent $MyInvocation.MyCommand.Definition
    $CIQ_Report = Import-Csv $scriptpathBM\CIQ_Report_$Server.csv
    
    If (Test-Path $CIQ_Report) {
    
    	[void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms.DataVisualization")
    
    
    	$chart = New-object System.Windows.Forms.DataVisualization.Charting.Chart
    	$chart.Width = 1024
    	$chart.Height = 1280
    	$chart.BackColor = [System.Drawing.ColorTranslator]::FromHtml("#e5e5e5")
    
    	[void]$chart.Titles.Add("VMware")
    	$chart.Titles[0].Font = "Arial,13pt"
    	$chart.Titles[0].Alignment = "topLeft"
    
    	$chartarea1 = New-Object System.Windows.Forms.DataVisualization.Charting.ChartArea
    	$chartarea1.Name = "ChartArea1"
    	$chartarea1.AxisY.Title = "Host Systems"
    	$chartarea1.AxisX.Title = "CPU - Range"
    	$chartarea1.AxisY.Interval = 5
    	$chartarea1.AxisX.Interval = 1
    	$chart.ChartAreas.Add($chartarea1)
    
    	$chartarea2 = New-Object System.Windows.Forms.DataVisualization.Charting.ChartArea
    	$chartarea2.Name = "ChartArea2"
    	$chartarea2.AxisY.Title = "Host Systems"
    	$chartarea2.AxisX.Title = "Memory - Range"
    	$chartarea2.AxisY.Interval = 5
    	$chartarea2.AxisX.Interval = 1
    	$chart.ChartAreas.Add($chartarea2)
    
    	$chartarea3 = New-Object System.Windows.Forms.DataVisualization.Charting.ChartArea
    	$chartarea3.Name = "ChartArea3"
    	$chartarea3.AxisY.Title = "Host Systems"
    	$chartarea3.AxisX.Title = "Disk - Range"
    	$chartarea3.AxisY.Interval = 5
    	$chartarea3.AxisX.Interval = 1
    	$chart.ChartAreas.Add($chartarea3)
    
    	[void]$chart.Series.Add("CPUHosts")
    	$chart.Series["CPUHosts"].ChartType = "Column"
    	$chart.Series["CPUHosts"].BorderWidth  = 3
    	$chart.Series["CPUHosts"].IsVisibleInLegend = $true
    	$chart.Series["CPUHosts"].chartarea = "ChartArea1"
    	$chart.Series["CPUHosts"].color = "#62B5CC"
    	$i = 0
    	do {
    		$chart.Series["CPUHosts"].Points.addxy( $CIQ_Report[$i].'CPU Range', $CIQ_Report[$i].'Host Systems')
    		$i++
    	}
    	while ($i -le 9)
    	$chart.Series["CPUHosts"].Points[9].Color = [System.Drawing.Color]::Red
    	$chart.Series["CPUHosts"].Points[9].AxisLabel = $chart.Series["CPUHosts"].Points[9].AxisLabel + " (" + $chart.Series["CPUHosts"].Points[9].YValues + ")"
    	$Chart.Series["CPUHosts"]["DrawingStyle"] = "Cylinder"
    	if ($chart.Series["CPUHosts"].Points[9].YValues -gt 0)
    	{
    		$chart.Series["CPUHosts"].Points[9].Label = "(" + $chart.Series["CPUHosts"].Points[9].YValues + ")"
    		$chart.Series["CPUHosts"].Points[9].LabelBackColor = "#FF0000"
    		$chart.Series["CPUHosts"].Points[9].LabelForeColor = "#FFFFFF"
    	}
    	Else
    	{
    		$chart.Series["CPUHosts"].Points[9].Label = ""
    		$chart.Series["CPUHosts"].Points[9].LabelBackColor = ""
    		$chart.Series["CPUHosts"].Points[9].LabelForeColor = ""
    	}
    
    
    
    	[void]$chart.Series.Add("MemoryHosts")
    	$chart.Series["MemoryHosts"].ChartType = "Column"
    	$chart.Series["MemoryHosts"].BorderWidth  = 3
    	$chart.Series["MemoryHosts"].IsVisibleInLegend = $true
    	$chart.Series["MemoryHosts"].chartarea = "ChartArea2"
    	$chart.Series["MemoryHosts"].color = "#62B5CC"
    	$i = 12
    	do {
    	$chart.Series["MemoryHosts"].Points.addxy( $CIQ_Report[$i].'CPU Range', $CIQ_Report[$i].'Host Systems')
    	$i++
    	}
    	while ($i -le 21)
    	$chart.Series["MemoryHosts"].Points[9].Color = [System.Drawing.Color]::Red
    	$chart.Series["MemoryHosts"].Points[9].AxisLabel = $chart.Series["MemoryHosts"].Points[9].AxisLabel + " (" + $chart.Series["MemoryHosts"].Points[9].YValues + ")"
    	$Chart.Series["MemoryHosts"]["DrawingStyle"] = "Cylinder"
    	if ($chart.Series["MemoryHosts"].Points[9].YValues -gt 0)
    	{
    		$chart.Series["MemoryHosts"].Points[9].Label = "(" + $chart.Series["MemoryHosts"].Points[9].YValues + ")"
    		$chart.Series["MemoryHosts"].Points[9].LabelBackColor = "#FF0000"
    		$chart.Series["MemoryHosts"].Points[9].LabelForeColor = "#FFFFFF"
    	}
    	Else
    	{
    		$chart.Series["MemoryHosts"].Points[9].Label = ""
    		$chart.Series["MemoryHosts"].Points[9].LabelBackColor = ""
    		$chart.Series["MemoryHosts"].Points[9].LabelForeColor = ""
    	}
    
    
    
    	[void]$chart.Series.Add("DiskHosts")
    	$chart.Series["DiskHosts"].ChartType = "Column"
    	$chart.Series["DiskHosts"].BorderWidth  = 3
    	$chart.Series["DiskHosts"].IsVisibleInLegend = $true
    	$chart.Series["DiskHosts"].chartarea = "ChartArea3"
    	$chart.Series["DiskHosts"].color = "#62B5CC"
    	$i = 24
    	do {
    		$chart.Series["DiskHosts"].Points.addxy( $CIQ_Report[$i].'CPU Range', $CIQ_Report[$i].'Host Systems')
    		$i++
    	}
    	while ($i -le 33)
    	$chart.Series["DiskHosts"].Points[9].Color = [System.Drawing.Color]::Red
    	$Chart.Series["DiskHosts"]["DrawingStyle"] = "Cylinder"
    	$chart.Series["DiskHosts"].Points[9].AxisLabel = $chart.Series["DiskHosts"].Points[9].AxisLabel + " (" + $chart.Series["DiskHosts"].Points[9].YValues + ")"
    
    	if ($chart.Series["DiskHosts"].Points[9].YValues -gt 0)
    	{
    		$chart.Series["DiskHosts"].Points[9].Label = "(" + $chart.Series["DiskHosts"].Points[9].YValues + ")"
    		$chart.Series["DiskHosts"].Points[9].LabelBackColor = "#FF0000"
    		$chart.Series["DiskHosts"].Points[9].LabelForeColor = "#FFFFFF"
    	}
    	Else
    	{
    		$chart.Series["DiskHosts"].Points[9].Label = ""
    		$chart.Series["DiskHosts"].Points[9].LabelBackColor = ""
    		$chart.Series["DiskHosts"].Points[9].LabelForeColor = ""
    	}
    
    	SaveImage("$scriptpathBM\SplineArea2.png","png")
    	
    }
    

    Montag, 10. Juni 2013 12:39