Gráficos en Powershell

Powershell se utiliza muchas veces para generar informes y representar datos. Para completar los datos y tablas, podemos crear gráficos que permiten ayudar en la visualización de esos datos, y para ello lo podemos hacer en PowerShell de una forma muy sencilla con Microsoft Chart Controls.

Vamos a ver paso a paso como crear de forma sencilla algunos ejemplos de gráficos creados en PowerShell.

  • Cargar los .NET Assemblies necesarios
[void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms.DataVisualization")

Utilizamos el espacio de nombres «System.Windows.Forms.DataVisualization»

  • Crear el objeto Chart
$chart = New-object System.Windows.Forms.DataVisualization.Charting.Chart

Esto nos crea un nuevo objeto chart que es la base sobre la que trabajaremos con el resto de objetos

  • Establecemos las propiedades básicas del gráfico
$chart.Width = 1000
$chart.Height = 1000
$chart.BackColor = "#FFDDDDDD"

Por defecto el tamaño del objeto chart es de 300 x 300. Con las propiedades Width y Height modificamos el tamaño del gráfico.

Con la propiedad BackColor podemos modificar el color de fondo del gráfico en formato ARGB (alfa, rojo, verde, azul).

  • Título del gráfico
$titulo = $chart.Titles.Add("Título del gráfico")
$chart.Titles[0].Font = "Arial,18pt"

Añadimos al objeto Chart un título y el tipo de letra. Podemos cambiar también otras propiedades del título como su color (ForeColor) o ubicación (Alignment)

  • Crear un objeto ChartArea
# chart area 
$chartarea = New-Object System.Windows.Forms.DataVisualization.Charting.ChartArea
$chartarea.Name = "ChartArea1"
$chartarea.AxisY.Title = "Título Eje Y"
$chartarea.AxisX.Title = "Título Eje X"
$chart.ChartAreas.Add($chartarea)

En el objeto CharArea es donde se «dibujaran» los gráficos. Podemos crear varios objetos de este tipo asociados a un mismo objeto de tipo Chart.

  • Añadimos el objeto de tipo Serie
$serie1 = $chart.Series.Add("Serie1")
$serie1.ChartArea = "ChartArea1"

Creamos el objeto Serie añadiéndolo al objeto Chart. Después lo asignamos al objeto ChartArea donde se va a dibujar.

  • Añadimos los datos a la serie correspondiente
$serie1.Points.AddXY(1,1)
$serie1.Points.AddXY(2,2)
$serie1.Points.AddXY(3,3)

Vamos añadiendo los datos a la serie como puntos y valores en los ejes X e Y

  • Leyenda
$legend = New-Object system.Windows.Forms.DataVisualization.Charting.Legend
$legend.name = "Legend1"
$chart.Legends.Add($legend)

Creamos el objecto Legend, le asignamos un nombre y lo añadimos al objeto de tipo Chart

  • Obtenemos el código completo para generar el gráfico
[void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms.DataVisualization")

#Chart
$chart = New-object System.Windows.Forms.DataVisualization.Charting.Chart
$chart.Width = 800
$chart.Height = 800
$chart.BackColor = "#FFDDDDDD"

#Titulo
$titulo = $chart.Titles.Add("Título del gráfico")
$chart.Titles[0].Font = "Arial,18pt"


#Chartarea 
$chartarea = New-Object System.Windows.Forms.DataVisualization.Charting.ChartArea
$chartarea.Name = "ChartArea1"
$chartarea.AxisY.Title = "Titulo Eje Y"
$chartarea.AxisX.Title = "Titulo Eje X"
$chart.ChartAreas.Add($chartarea)

#Series
$serie1 = $chart.Series.Add("Serie1")
$serie1.ChartArea = "ChartArea1"

#Datos
$serie1.Points.AddXY(1,1)
$serie1.Points.AddXY(2,2)
$serie1.Points.AddXY(3,3)


#Legend 
$legend = New-Object system.Windows.Forms.DataVisualization.Charting.Legend
$legend.name = "Legend1"
$chart.Legends.Add($legend)

 

  • Visualización del gráfico
$chart.SaveImage("z:\temp\SplineArea.png","png")

La opción más sencilla para visualizar el gráfico que hemos generado es guardarlo, por ejemplo, como un archivo PNG.

PowerShell-Graficos-01

 

Así es como quedaría la vista de los diferentes objetos que hemos ido creando en el gráfico

PowerShell-Graficos-02

 

Ejemplos

Ahora vamos a ver varios ejemplos de algunas de las posibilidades que tenemos para crear diferentes tipos de gráficos

Top 5 de procesos en memoria virtual consumida
Memoria
[void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms.DataVisualization")

#Chart
$chart = New-object System.Windows.Forms.DataVisualization.Charting.Chart
$chart.Width = 800
$chart.Height = 800
$chart.BackColor = "#FFDDDDDD"

#Title
$titulo = $chart.Titles.Add("Top 5 de procesos en consumo de memoria")
$chart.Titles[0].Font = "Arial,18pt"


#Chartarea 
$chartarea = New-Object System.Windows.Forms.DataVisualization.Charting.ChartArea
$chartarea.Name = "ChartArea1"
$chartarea.AxisY.Title = "MB"
$chartarea.AxisX.Title = "Procesos"
$chart.ChartAreas.Add($chartarea)

#Legend 
$legend = New-Object system.Windows.Forms.DataVisualization.Charting.Legend
$legend.name = "Legend1"
$chart.Legends.Add($legend)

#Series

[void]$chart.Series.Add("VirtualMem")
$chart.Series["VirtualMem"].ChartType = "Column"
$chart.Series["VirtualMem"].chartarea = "ChartArea1"
$chart.Series["VirtualMem"].Legend = "Legend1"
Get-Process | Sort VirtualMemorySize -Descending  | Select-Object -First 5 | ForEach-Object {$chart.Series["VirtualMem"].Points.addxy( $_.Name , ($_.VirtualMemorySize / 1000000)) }

 

Top 5 de procesos en memoria virtual y privada consumida
Memoria3
#Top 5 de procesos en uso de memoria
[void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms.DataVisualization")

#Chart
$chart = New-object System.Windows.Forms.DataVisualization.Charting.Chart
$chart.Width = 800
$chart.Height = 800
$chart.BackColor = "#FFDDDDDD"

#Title
$titulo = $chart.Titles.Add("Top 5 de procesos en consumo de memoria")
$chart.Titles[0].Font = "Arial,18pt"


#Chartarea 
$chartarea = New-Object System.Windows.Forms.DataVisualization.Charting.ChartArea
$chartarea.Name = "ChartArea1"
$chartarea.AxisY.Title = "MB"
$chartarea.AxisX.Title = "Procesos"
$chart.ChartAreas.Add($chartarea)

#Legend 
$legend = New-Object system.Windows.Forms.DataVisualization.Charting.Legend
$legend.name = "Legend1"
$chart.Legends.Add($legend)

#Series
[void]$chart.Series.Add("VirtualMem")
$chart.Series["VirtualMem"].ChartType = "Column"
$chart.Series["VirtualMem"].chartarea = "ChartArea1"
$chart.Series["VirtualMem"].Legend = "Legend1"
Get-Process | Sort VirtualMemorySize -Descending  | Select-Object -First 5 | ForEach-Object {$chart.Series["VirtualMem"].Points.addxy( $_.Name , ($_.VirtualMemorySize / 1000000)) }

[void]$chart.Series.Add("PrivateMem")
$chart.Series["PrivateMem"].ChartType = "Column"
$chart.Series["PrivateMem"].chartarea = "ChartArea1"
$chart.Series["PrivateMem"].Legend = "Legend1"
Get-Process | Sort PrivateMemorySize -Descending  | Select-Object -First 5 | ForEach-Object {$chart.Series["PrivateMem"].Points.addxy( $_.Name , ($_.PrivateMemorySize/ 1000000)) }

 

 

Top 5 de procesos en memoria y CPU consumida
Memoria-CPU1
[void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms.DataVisualization")

#Chart
$chart = New-object System.Windows.Forms.DataVisualization.Charting.Chart
$chart.Width = 800
$chart.Height = 800
$chart.BackColor = "#FFDDDDDD"

#Title
$titulo = $chart.Titles.Add("Top 5 de procesos en consumo de memoria")
$chart.Titles[0].Font = "Arial,18pt"


#Chartarea 
$chartarea = New-Object System.Windows.Forms.DataVisualization.Charting.ChartArea
$chartarea.Name = "ChartArea1"
$chartarea.AxisY.Title = "MB"
$chartarea.AxisX.Title = "Procesos"
$chart.ChartAreas.Add($chartarea)


#Chartarea 
$chartarea2 = New-Object System.Windows.Forms.DataVisualization.Charting.ChartArea
$chartarea2.Name = "ChartArea2"
$chartarea2.AxisY.Title = "Uso de CPU"
$chartarea2.AxisX.Title = "Procesos"
$chart.ChartAreas.Add($chartarea2)

#Legend 
$legend = New-Object system.Windows.Forms.DataVisualization.Charting.Legend
$legend.name = "Legend1"
$chart.Legends.Add($legend)

#Series
[void]$chart.Series.Add("VirtualMem")
$chart.Series["VirtualMem"].ChartType = "Column"
$chart.Series["VirtualMem"].chartarea = "ChartArea1"
$chart.Series["VirtualMem"].Legend = "Legend1"
Get-Process | Sort VirtualMemorySize -Descending  | Select-Object -First 5 | ForEach-Object {$chart.Series["VirtualMem"].Points.addxy( $_.Name , ($_.VirtualMemorySize / 1000000)) }

[void]$chart.Series.Add("PrivateMem")
$chart.Series["PrivateMem"].ChartType = "Column"
$chart.Series["PrivateMem"].chartarea = "ChartArea1"
$chart.Series["PrivateMem"].Legend = "Legend1"
Get-Process | Sort PrivateMemorySize -Descending  | Select-Object -First 5 | ForEach-Object {$chart.Series["PrivateMem"].Points.addxy( $_.Name , ($_.PrivateMemorySize / 1000000)) }


[void]$chart.Series.Add("CPUUsage")
$chart.Series["CPUUsage"].ChartType = "Column"
$chart.Series["CPUUsage"].chartarea = "ChartArea2"
$chart.Series["CPUUsage"].Legend = "Legend1"
Get-Process | Sort CPU -Descending  | Select-Object -First 5 | ForEach-Object {$chart.Series["CPUUsage"].Points.addxy( $_.Name , ($_.CPU / 1000)) }


$chart.SaveImage("z:\temp\Memoria-CPU1.png","png")
Invoke-expression z:\temp\Memoria-CPU1.png

 

 

 

Gráfico de tipo Barras
Memoria-CPU2
[void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms.DataVisualization")

#Chart
$chart = New-object System.Windows.Forms.DataVisualization.Charting.Chart
$chart.Width = 800
$chart.Height = 800
$chart.BackColor = "#FFDDDDDD"

#Title
$titulo = $chart.Titles.Add("Top 5 de procesos en consumo de memoria")
$chart.Titles[0].Font = "Arial,18pt"


#Chartarea 
$chartarea = New-Object System.Windows.Forms.DataVisualization.Charting.ChartArea
$chartarea.Name = "ChartArea1"
$chartarea.AxisY.Title = "MB"
$chartarea.AxisX.Title = "Procesos"
$chart.ChartAreas.Add($chartarea)


#Chartarea 
$chartarea2 = New-Object System.Windows.Forms.DataVisualization.Charting.ChartArea
$chartarea2.Name = "ChartArea2"
$chartarea2.AxisY.Title = "Uso de CPU"
$chartarea2.AxisX.Title = "Procesos"
$chart.ChartAreas.Add($chartarea2)

#Legend 
$legend = New-Object system.Windows.Forms.DataVisualization.Charting.Legend
$legend.name = "Legend1"
$chart.Legends.Add($legend)

#Series
[void]$chart.Series.Add("VirtualMem")
$chart.Series["VirtualMem"].ChartType = "Column"
$chart.Series["VirtualMem"].chartarea = "ChartArea1"
$chart.Series["VirtualMem"].Legend = "Legend1"
Get-Process | Sort VirtualMemorySize -Descending  | Select-Object -First 5 | ForEach-Object {$chart.Series["VirtualMem"].Points.addxy( $_.Name , ($_.VirtualMemorySize / 1000000)) }

[void]$chart.Series.Add("PrivateMem")
$chart.Series["PrivateMem"].ChartType = "Column"
$chart.Series["PrivateMem"].chartarea = "ChartArea1"
$chart.Series["PrivateMem"].Legend = "Legend1"
Get-Process | Sort PrivateMemorySize -Descending  | Select-Object -First 5 | ForEach-Object {$chart.Series["PrivateMem"].Points.addxy( $_.Name , ($_.PrivateMemorySize / 1000000)) }


[void]$chart.Series.Add("CPUUsage")
$chart.Series["CPUUsage"].ChartType = "Bar"
$chart.Series["CPUUsage"].chartarea = "ChartArea2"
$chart.Series["CPUUsage"].Legend = "Legend1"
Get-Process | Sort CPU -Descending  | Select-Object -First 5 | ForEach-Object {$chart.Series["CPUUsage"].Points.addxy( $_.Name , ($_.CPU / 1000)) }

 

Enlaces

Un comentario en “Gráficos en Powershell

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.