Change color of each line in Spline Chart using C# and VB.Net in Windows Application

Last Reply 6 months ago By dharmendr

Posted 6 months ago

Hello Everyone,

How do I put different color for each spline line in my data chart

I am doing a project in my vb.net and I have a chart that shows me 5 different lines for my data.

Here is the code that I am using for my Project :

    Private Sub DataCharts()
        Dim dt As DataTable = GetData("Chart_Monthly1")
        Dim departments As List(Of String) = (From p In dt.AsEnumerable()
                                              Select p.Field(Of String)("Department")).Distinct().ToList()

        Dim years As List(Of String) = (From p In dt.AsEnumerable()
                                        Order By p.Field(Of String)("year")
                                        Select p.Field(Of String)("year")).Distinct().ToList()

        If Chart1.Series.Count() = 1 Then
            Chart1.Series.Remove(Chart1.Series(0))
        End If
        Chart1.Series.Clear()

        For Each department As String In departments
            Dim x As List(Of String) = New List(Of String)()
            Dim y As List(Of Decimal) = New List(Of Decimal)()
            For Each year As String In years
                x.Add(year)
                y.Add((From p In dt.AsEnumerable()
                       Where p.Field(Of String)("Department") = department And p.Field(Of String)("year") = year
                       Order By p.Field(Of String)("year")
                       Select p.Field(Of Decimal)("Total")).FirstOrDefault())
            Next
            Chart1.Series.Add(New Series(department))
            Chart1.Series(department).IsValueShownAsLabel = True
            Chart1.Series(department).BorderWidth = 2
            Chart1.Series(department).ChartType = SeriesChartType.Spline
            Chart1.Series(department).Points.DataBindXY(x, y)
            Chart1.Series(department).LabelForeColor = Color.MediumSeaGreen
            Chart1.Series(department).EmptyPointStyle.Color = Color.Red
            Chart1.Series(department).EmptyPointStyle.AxisLabel = "Empty"
        Next
        Chart1.Legends(0).Enabled = True
        Dim MyData As Single() = New Single(Chart1.Series.Count - 1) {}
        For i = 0 To Chart1.Series.Count - 1
            MyData(i) = Convert.ToSingle(5 * Math.Sin(i / CDbl(2)))
            Dim withBlock = Chart1.Series(i)
            withBlock.BorderWidth = 2
            withBlock.MarkerStyle = MarkerStyle.Circle
            withBlock.MarkerSize = 8
            Chart1.Annotations.Add(New CalloutAnnotation())
        Next

    End Sub

What I have tried: I tried googling but all the results that I got are how to change the colors in properties which when I do it changes all the color of the spline line. 

Any help is appreciated.

Posted 6 months ago

Hi elvisidrizi1,

You can't define specific color for each series as no of series increase or decrease according to the filter condition.

To change color you need to apply random color.

Check this example. Now please take its reference and correct your code.

Namespaces

C#

using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Windows.Forms.DataVisualization.Charting;

VB.Net

Imports System.Data
Imports System.Data.SqlClient
Imports System.Drawing
Imports System.Windows.Forms.DataVisualization.Charting

Code

C#

public partial class Form1 : Form
{
    private string constr = "Data Source=####/SQLEXPRESS;Initial Catalog=Expenses;Trusted_Connection=yes;"
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        DataCharts();
    }
    private void DataCharts()
    {
        DataTable dt = GetData("Chart_Monthly1");
        List<string> departments = (from p in dt.AsEnumerable()
                                    select p.Field<string>("Department")).Distinct().ToList();

        List<string> years = (from p in dt.AsEnumerable()
                                orderby p.Field<string>("year")
                                select p.Field<string>("year")).Distinct().ToList();

        if (Chart1.Series.Count() == 1)
        {
            Chart1.Series.Remove(Chart1.Series[0]);
        }
        Chart1.Series.Clear();

        Random rnd = new Random();
        foreach (string department in departments)
        {
            List<string> x = new List<string>();
            List<decimal> y = new List<decimal>();
            foreach (string year in years)
            {
                x.Add(year);
                y.Add((from p in dt.AsEnumerable()
                        where p.Field<string>("Department") == department & p.Field<string>("year") == year
                        orderby p.Field<string>("year")
                        select p.Field<decimal>("Total")).FirstOrDefault());
            }
            Chart1.Series.Add(new Series(department));
            Chart1.Series[department].IsValueShownAsLabel = true;
            Chart1.Series[department].BorderWidth = 2;
            Chart1.Series[department].ChartType = SeriesChartType.Spline;
            Chart1.Series[department].Points.DataBindXY(x, y);
            Chart1.Series[department].LabelForeColor = Color.MediumSeaGreen;
            Chart1.Series[department].EmptyPointStyle.Color = Color.Red;
            Chart1.Series[department].EmptyPointStyle.AxisLabel = "Empty";
            Chart1.Series[department].Color = Color.FromArgb(rnd.Next(256), rnd.Next(256), rnd.Next(256));
        }
        Chart1.Legends[0].Enabled = true;
        float[] MyData = new float[Chart1.Series.Count];
        for (var i = 0; i < Chart1.Series.Count; i++)
        {
            MyData[i] = Convert.ToSingle(5 * Math.Sin(i / (double)2));
            var withBlock = Chart1.Series[i];
            withBlock.BorderWidth = 2;
            withBlock.MarkerStyle = MarkerStyle.Circle;
            withBlock.MarkerSize = 8;
        }
    }
    private DataTable GetData(string query)
    {
        DataTable dt = new DataTable();
        using (SqlConnection con = new SqlConnection(constr))
        {
            using (SqlCommand command = new SqlCommand(query, con))
            {
                command.CommandType = CommandType.StoredProcedure;
                command.Parameters.AddWithValue("@DateFrom", "2020-01-01");
                command.Parameters.AddWithValue("@DateTo", "2020-07-07");
                using (SqlDataAdapter sda = new SqlDataAdapter(command))
                {
                    sda.Fill(dt);
                }
            }
        }
        return dt;
    }
}

VB.Net

Public Class Form1
    Dim constr As String = "Data Source=####/SQLEXPRESS;Initial Catalog=Expenses;Trusted_Connection=yes;"
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        DataCharts()
    End Sub
    Private Sub DataCharts()
        Dim dt As DataTable = GetData("Chart_Monthly1")
        Dim departments As List(Of String) = (From p In dt.AsEnumerable()
                                              Select p.Field(Of String)("Department")).Distinct().ToList()

        Dim years As List(Of String) = (From p In dt.AsEnumerable()
                                        Order By p.Field(Of String)("year")
                                        Select p.Field(Of String)("year")).Distinct().ToList()

        If Chart1.Series.Count() = 1 Then
            Chart1.Series.Remove(Chart1.Series(0))
        End If
        Chart1.Series.Clear()
        Dim rnd As Random = New Random()
        For Each department As String In departments
            Dim x As List(Of String) = New List(Of String)()
            Dim y As List(Of Decimal) = New List(Of Decimal)()
            For Each year As String In years
                x.Add(year)
                y.Add((From p In dt.AsEnumerable()
                       Where p.Field(Of String)("Department") = department And p.Field(Of String)("year") = year
                       Order By p.Field(Of String)("year")
                       Select p.Field(Of Decimal)("Total")).FirstOrDefault())
            Next
            Chart1.Series.Add(New Series(department))
            Chart1.Series(department).IsValueShownAsLabel = True
            Chart1.Series(department).BorderWidth = 2
            Chart1.Series(department).ChartType = SeriesChartType.Spline
            Chart1.Series(department).Points.DataBindXY(x, y)
            Chart1.Series(department).LabelForeColor = Color.MediumSeaGreen
            Chart1.Series(department).EmptyPointStyle.Color = Color.Red
            Chart1.Series(department).EmptyPointStyle.AxisLabel = "Empty"
            Chart1.Series(department).Color = Color.FromArgb(rnd.Next(256), rnd.Next(256), rnd.Next(256))
        Next
        Chart1.Legends(0).Enabled = True
        Dim MyData As Single() = New Single(Chart1.Series.Count - 1) {}
        For i = 0 To Chart1.Series.Count - 1
            MyData(i) = Convert.ToSingle(5 * Math.Sin(i / CDbl(2)))
            Dim withBlock = Chart1.Series(i)
            withBlock.BorderWidth = 2
            withBlock.MarkerStyle = MarkerStyle.Circle
            withBlock.MarkerSize = 8
        Next
    End Sub
    Private Function GetData(ByVal query As String) As DataTable
        Dim dt As DataTable = New DataTable()
        Using con As SqlConnection = New SqlConnection(constr)
            Using command As New SqlCommand(query, con)
                command.CommandType = CommandType.StoredProcedure
                command.Parameters.AddWithValue("@DateFrom", "2020-01-01")
                command.Parameters.AddWithValue("@DateTo", "2020-07-07")
                Using sda As SqlDataAdapter = New SqlDataAdapter(command)
                    sda.Fill(dt)
                End Using
            End Using
        End Using
        Return dt
    End Function
End Class

Screenshot


Posted 6 months ago

Use this.

Private Sub DataCharts()
    Dim dt As DataTable = GetData("Chart_Monthly1")
    Dim departments As List(Of String) = (From p In dt.AsEnumerable()
                                            Select p.Field(Of String)("Department")).Distinct().ToList()

    Dim years As List(Of String) = (From p In dt.AsEnumerable()
                                    Order By p.Field(Of String)("year")
                                    Select p.Field(Of String)("year")).Distinct().ToList()

    If Chart1.Series.Count() = 1 Then
        Chart1.Series.Remove(Chart1.Series(0))
    End If
    Chart1.Series.Clear()
    Dim rnd As Random = New Random()
    For Each department As String In departments
        Dim x As List(Of String) = New List(Of String)()
        Dim y As List(Of Decimal) = New List(Of Decimal)()
        For Each year As String In years
            x.Add(year)
            y.Add((From p In dt.AsEnumerable()
                    Where p.Field(Of String)("Department") = department And p.Field(Of String)("year") = year
                    Order By p.Field(Of String)("year")
                    Select p.Field(Of Decimal)("Total")).FirstOrDefault())
        Next
        Chart1.Series.Add(New Series(department))
        Chart1.Series(department).IsValueShownAsLabel = True
        Chart1.Series(department).BorderWidth = 2
        Chart1.Series(department).ChartType = SeriesChartType.Spline
        Chart1.Series(department).Points.DataBindXY(x, y)
        Chart1.Series(department).LabelForeColor = Color.MediumSeaGreen
        Chart1.Series(department).EmptyPointStyle.Color = Color.Red
        Chart1.Series(department).EmptyPointStyle.AxisLabel = "Empty"
        'Chart1.Series(department).Color = Color.FromArgb(rnd.Next(256), rnd.Next(256), rnd.Next(256))
    Next
    Chart1.Series(0).Color = Color.Red
    Chart1.Series(1).Color = Color.Green
    Chart1.Series(2).Color = Color.Yellow
    Chart1.Series(3).Color = Color.Violet
    Chart1.Series(4).Color = Color.Orange
    Chart1.Legends(0).Enabled = True
    Dim MyData As Single() = New Single(Chart1.Series.Count - 1) {}
    For i = 0 To Chart1.Series.Count - 1
        MyData(i) = Convert.ToSingle(5 * Math.Sin(i / CDbl(2)))
        Dim withBlock = Chart1.Series(i)
        withBlock.BorderWidth = 2
        withBlock.MarkerStyle = MarkerStyle.Circle
        withBlock.MarkerSize = 8
    Next
End Sub