none
Agregar datos a grafico CHART desde un array multidimensional.

    Pregunta

  • Buenas saludos a todos, mi situación es la siguiente: estoy graficando la información  de los ingresos obtenidos durante un periodo determinado de años y muestro su desarrollo de forma mensual o sea muestro los ingresos mensuales obtenidos durante cada año del periodo y así poder comparar la información de crecimiento o decrecimiento en el mismo mes en los diferentes años. Para esto genero las diferentes consultas que requiero y almaceno la información en un array multidimensional de la siguiente forma:

    Enero, 50.000, 48.000, 35.000, 60.000 ' En enero de 2010 50.000, enero 2011 48.000, enero 2012 35.000, 2013 60.000

    Febrero, 60.000, 55.000, 49.000, 53.000

    Marzo, 80.000, 75.000, 93.000, 25.000

    .......

    El problema me surge al pasar los datos al gráfico

    Chart1.Series(0).Points.DataBindXY(Matriz), aquí me dice que hay que especificar los datos del eje y, en otro gráfico de reporte semanal cargo los datos en dos array unidimensionales de la siguiente forma:

    Chart1.Series(0).Points.DataBindXY(Dias, Montos) y todo perfecto pero ya intenté poner sólo los meses en un array y los montos en e otro y me da error.

    Agradezco mucho su colaboración.

    lunes, 13 de febrero de 2017 16:36

Respuestas

  • Tienes dos problemas menores al organizar tus datos como un arreglo multidimensional. El tipo del arreglo debería ser Object (para contener tanto textos como números), y no tienes "columnas".

    Vos tendrías que filtrar tu arreglo para obtener el par de columnas que vas bindear en cada serie. Osease, instancias una serie, y bindeas el arreglo con los nombres de los meses y el arreglo con la columna para ese serie, que acabas de filtrar.

    Si tuvieses una tabla, ya tendrías la columnas. DataBindTable genera las series automáticamente, vos le indicás cuál de las columnas es la de los meses para que la use como X común. El resto de las columnas es Y.

    • Marcado como respuesta Frank Jarquin martes, 14 de febrero de 2017 14:42
    martes, 14 de febrero de 2017 12:45

Todas las respuestas

  • Hola:

    En un Form con 1 Chart, copia y pega el siguiente codigo

    Imports System.Windows.Forms.DataVisualization.Charting
    Public Class Form1
        Dim mdtDataTable As New DataTable
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            Me.Chart1.Dock = DockStyle.Fill
            mdtDataTable.Columns.Add(New DataColumn("Mes", Type.GetType("System.String")))
            mdtDataTable.Columns.Add(New DataColumn("Valor", Type.GetType("System.Int32")))
            '
            lP_CargaDatos()
            Grafico()
        End Sub
        Private Sub lP_CargaDatos()
            mdtDataTable.Rows.Add(New Object() {"Enero 2010", 50000})
            mdtDataTable.Rows.Add(New Object() {"Enero 2011", 48000})
            mdtDataTable.Rows.Add(New Object() {"Enero 2012", 35000})
            mdtDataTable.Rows.Add(New Object() {"Enero 2013", 60000})
            mdtDataTable.Rows.Add(New Object() {"Febrero 2010", 60000})
            mdtDataTable.Rows.Add(New Object() {"Febrero 2011", 55000})
            mdtDataTable.Rows.Add(New Object() {"Febrero 2012", 49000})
            mdtDataTable.Rows.Add(New Object() {"Febrero 2013", 53000})
            mdtDataTable.Rows.Add(New Object() {"Marzo 2010", 80000})
            mdtDataTable.Rows.Add(New Object() {"Marzo 2011", 75000})
            mdtDataTable.Rows.Add(New Object() {"Marzo 2012", 93000})
            mdtDataTable.Rows.Add(New Object() {"Marzo 2013", 25000})
        End Sub
        Private Sub Grafico()
            Chart1.DataSource = mdtDataTable
            '~~> TRABAJANDO CON LA CARTA <~~'
            Dim CArea As ChartArea = Chart1.ChartAreas(0)
            CArea.BackColor = Color.Azure           '~~> Cambio del color posterior del área del gráfico
            CArea.ShadowColor = Color.Red           '~~> Cambio del color de sombra del área de gráfico
            CArea.Area3DStyle.Enable3D = True       '~~> Cambiar el estilo de gráfico a 3D
            '~~> Formatear el eje X
            CArea.AxisX.MajorGrid.Enabled = False   '~~> Se eliminaron las grandes redes del eje X
            '~~> Configuración de fuente, tamaño de fuente e itálica
            CArea.AxisX.LabelStyle.Font = New System.Drawing.Font("Times New Roman", 11.0F, System.Drawing.FontStyle.Italic)
            '~~> Formateando el eje Y
            CArea.AxisY.MajorGrid.Enabled = False   '~~> Se eliminaron las principales redes del eje Y
            CArea.AxisY.LabelStyle.Format = "0.00%" '~~> Formatear el eje Y para mostrar los valores en %
            CArea.AxisY.Interval = 0.2              '~~> Formato del eje Y Intervalo al 20%
            '~~> TRABAJAR CON TÍTULO <~~'
            '~~> Añadir un título
            Dim T As Title = Chart1.Titles.Add("Estadistica por Meses")
            '~~> Formatear el título
            With T
                .ForeColor = Color.Black            '~~> Cambiar el color de la parte delantera del título
                .BackColor = Color.Coral            '~~> Cambio del color de fondo del título
                '~~> Configuración de fuente, tamaño de fuente y negrita / en cursiva
                .Font = New System.Drawing.Font("Times New Roman", 11.0F, System.Drawing.FontStyle.Bold)
                .Font = New System.Drawing.Font("Times New Roman", 11.0F, System.Drawing.FontStyle.Underline)
                .BorderColor = Color.Black          '~~> Cambiar el color del borde del título
                .BorderDashStyle = ChartDashStyle.DashDotDot '~~> Cambiar el estilo de trazo de frontera del título
            End With
            '~~> TRABAJANDO CON LA SERIE <~~'
            Dim Series1 As Series = Chart1.Series("Series1")
            '~~> Ajuste de la serie Nombre
            Series1.Name = "Ingresos"
            '~~> Asignación de valores al eje X e Y
            Chart1.Series(Series1.Name).XValueMember = "Mes"
            Chart1.Series(Series1.Name).YValueMembers = "Valor"
            '~~> Configuración de fuente, tamaño de fuente y negrita
            Chart1.Series(Series1.Name).Font = New System.Drawing.Font("Times New Roman", 11.0F, System.Drawing.FontStyle.Bold)
            '~~> Valor de ajuste Tipo
            Chart1.Series(Series1.Name).YValueType = ChartValueType.Double
            '~~> Configuración del tipo de gráfico para la visualización
            Chart1.Series(Series1.Name).ChartType = SeriesChartType.Bar
            '~~> Mostrar etiquetas de datos
            Chart1.Series(Series1.Name).IsValueShownAsLabel = True
            '~~> Establecer el color delantero de la etiqueta
            Chart1.Series(Series1.Name).LabelForeColor = Color.DarkGreen
            '~~> Configuración del formato de la etiqueta
            Chart1.Series(Series1.Name).LabelFormat = "0"
            '~~> TRABAJANDO CON LEYENDA <~~'
            Dim LG As Legend = Chart1.Legends(0)
            '~~> Cambiar el color trasero de la leyenda
            LG.BackColor = Color.Wheat
            '~~> Cambiar el color de la leyenda
            LG.ForeColor = Color.DarkSlateBlue
            '~~> Configuración de fuente, tamaño de fuente y negrita
            LG.Font = New System.Drawing.Font("Times New Roman", 11.0F, System.Drawing.FontStyle.Bold)
            '~~> Asignación de un título para la leyenda
            LG.Title = "LEYENDA"
            '~~> Configuración de la ubicación del gráfico
            'Me.Chart1.Location = New Point(5, 5)
            'Chart1.Size = New System.Drawing.Size(780, 410)
        End Sub
    End Class

    P.D.
    El resultado es:

    Un saludo desde Bilbo
    Carlos
    lunes, 13 de febrero de 2017 22:36
  • Gracias voy a intentar adaptar parte de esta información para mi código, en realidad todo el proceso de cargar la información en un array multidimensional lo logro sin ningún problema, el problema está en cómo pasarle esa información al gráfico.

    'cargo los valores de la matriz en el gráfico
     Chart1.Series(0).Points.DataBindXY(Matriz_meses_Montos)

    Excepción producida: 'System.ArgumentException' en System.Windows.Forms.DataVisualization.dll

    Información adicional: Error de enlace de puntos de datos. Se deben especificar valores Y.

    Si hay un controlador para esta excepción, el programa puede continuar de forma segura.

    martes, 14 de febrero de 2017 1:02
  • Tienes dos problemas menores al organizar tus datos como un arreglo multidimensional. El tipo del arreglo debería ser Object (para contener tanto textos como números), y no tienes "columnas".

    Vos tendrías que filtrar tu arreglo para obtener el par de columnas que vas bindear en cada serie. Osease, instancias una serie, y bindeas el arreglo con los nombres de los meses y el arreglo con la columna para ese serie, que acabas de filtrar.

    Si tuvieses una tabla, ya tendrías la columnas. DataBindTable genera las series automáticamente, vos le indicás cuál de las columnas es la de los meses para que la use como X común. El resto de las columnas es Y.

    • Marcado como respuesta Frank Jarquin martes, 14 de febrero de 2017 14:42
    martes, 14 de febrero de 2017 12:45
  • Gracias Walter, sí estaba justamente pensando en eso, voy a crear una tabla temporal para cargar la información del gráfico, esa información la recojo de varias consultas ya que los ingresos se generan por ventas de contado, por apartados, por credito, por reparaciones así que debo consultar varias tablas para obtener la información deseada. Gracias también Juan Carlos Herrero con la información de ambos tengo ahora un panorama más amplio para solucionar el problema.
    martes, 14 de febrero de 2017 14:41