Page 1 of 1

Start position for bar series

Posted: Wed Feb 05, 2014 2:00 pm
by 16064951
Hi,

Is there any way to set start position for bar series with stack style set as self-stacked?
For instance, for the stacked bar series in attached snap, can we have starting position as 4.5 so that bar will start from this point?

We are using tee chart for .net (Version 4.1.2013.7302).

Thanks in advance,
Chandran

Re: Start position for bar series

Posted: Thu Feb 06, 2014 3:20 pm
by Christopher
Hello Chandran,
Chandran wrote: For instance, for the stacked bar series in attached snap, can we have starting position as 4.5 so that bar will start from this point?
One technique would be to use series labels, e.g.

Code: Select all

    Bar series1, series2;
    private void InitializeChart()
    {
      tChart1.Aspect.View3D = false;
      series1 = new Bar(tChart1.Chart);
      series1.Add(1, "10");
      series1.Add(2, "20");
      series1.MultiBar = MultiBars.SelfStack;

      series2 = new Bar(tChart1.Chart);
      series2.Add(3, "");
      series2.Add(4, "");
      series2.MultiBar = MultiBars.SelfStack;
    }
another technique would be to use custom labels, e.g.

Code: Select all

    Bar series1, series2;
    private void InitializeChart()
    {
      tChart1.Aspect.View3D = false;
      series1 = new Bar(tChart1.Chart);
      series1.Add(1, 1);
      series1.Add(2, 2);
      series1.MultiBar = MultiBars.SelfStack;

      series2 = new Bar(tChart1.Chart);
      series2.Add(3, 3);
      series2.Add(4, 4);
      series2.MultiBar = MultiBars.SelfStack;

      tChart1.Axes.Bottom.Labels.Items.Add(-1, "-10");
      tChart1.Axes.Bottom.Labels.Items.Add(0, "0");
      tChart1.Axes.Bottom.Labels.Items.Add(1, "10");
      tChart1.Axes.Bottom.Labels.Items.Add(2, "200");
    }
yet another technique would be to use the GetAxisLabel event, e.g.

Code: Select all

    Bar series1, series2;
    private void InitializeChart()
    {
      tChart1.GetAxisLabel += tChart1_GetAxisLabel;
      tChart1.Aspect.View3D = false;
      series1 = new Bar(tChart1.Chart);
      series1.Add(1, 1);
      series1.Add(2, 2);
      series1.MultiBar = MultiBars.SelfStack;

      series2 = new Bar(tChart1.Chart);
      series2.Add(3, 3);
      series2.Add(4, 4);
      series2.MultiBar = MultiBars.SelfStack;
    }

    void tChart1_GetAxisLabel(object sender, GetAxisLabelEventArgs e)
    {
      if (sender.Equals(tChart1.Axes.Bottom))
      {
        double label = Convert.ToDouble(e.LabelText);

        label += 4;

        e.LabelText = label.ToString();

        if (e.LabelText == "4")
        {
          e.LabelText = "50";
        }
      }
    }

Re: Start position for bar series

Posted: Fri Feb 07, 2014 2:10 pm
by 16064951
Hi Christopher,

Thanks for your response.
I’ve tried the solution provided. But it is not as per our requirement.
I’ve attached an image which depicts what is expected to be rendered against the default rendering.

To elaborate more on this scenario, as shown in the “Default Rendering” image the Y-Axis starts from ‘0’.
But in our case, it should start at ‘3.8’ as shown in the “Expected Rendering” image.

Could you please suggest any solution?

Thanks,
Chandran

Re: Start position for bar series

Posted: Fri Feb 07, 2014 2:18 pm
by Christopher
Chandran wrote:Could you please suggest any solution?
I'm afraid I'm going to need to ask you for a small code-snippet with which I can reproduce your problem, along with a little more detail of precisely what you'd like to see.

Many thanks in advance for your kind collaboration.

Re: Start position for bar series

Posted: Tue Feb 11, 2014 1:47 pm
by 16064951
Hi Christopher,

Here is sample forms application illustrating what we want.
It has one bar series with 10 points. Multibars property for bar series is set to self-stacked.
As can be seen after running it, bar series is drawn from (0,0) irrespective of specified x value in series data.

Here are the issues revisited:
Issue 1: Can we draw it from any given left axis value? For instance, if we want to draw it from y=5 onwards, is it possible?
Issue 2: Since all data points in this series are having x as 4, why this bar is drawn on x=0 and why not on x = 4?
To summarize, can we have customized starting position for bar drawing, say in this case, can we make the bar drawing start from (4,20) instead (0,0)?

Please let us know in case of any more inputs/clarification.

Thanks,
Chandran

Re: Start position for bar series

Posted: Thu Feb 13, 2014 2:46 pm
by narcis
Hi Chandran,
Issue 2: Since all data points in this series are having x as 4, why this bar is drawn on x=0 and why not on x = 4?
This is because of MultiBars.SelfStack, which stacks all bars to 0.
To summarize, can we have customized starting position for bar drawing, say in this case, can we make the bar drawing start from (4,20) instead (0,0)?
Yes, a solution that solves both issues would be applying some sort of offset to the axis labels using the GetAxisLabel event, for example:

Code: Select all

using System;
using System.Drawing;
using System.Windows.Forms;
using Steema.TeeChart;
using Steema.TeeChart.Styles;

namespace WindowsFormsApplication2
{
	public partial class Form1 : Form
	{
		TChart tChart1;

		public Form1()
		{
			InitializeComponent();
			CreateChart();
			InitializeChart();
		}

        Bar series1;
        Steema.TeeChart.Drawing.PointDouble drawAt;

        private void InitializeChart()
        {
            tChart1.Aspect.View3D = false;
            series1 = new Bar(tChart1.Chart);

            series1.BarWidthPercent = 15;
            series1.Marks.Visible = false;
            
            series1.Add(4, 10, ColorConst.First);
            series1.Add(4, 5, ColorConst.Second);
            series1.Add(4, 20, ColorConst.Third);
            series1.Add(4, 30, ColorConst.Forth);
            series1.Add(4, 5, ColorConst.Fifth);
            series1.Add(4, 40, ColorConst.Sixth);
            series1.Add(4, 25, ColorConst.Seventh);
            series1.Add(4, 10, ColorConst.Eight);
            series1.Add(4, 23, ColorConst.Nineth);
            series1.Add(4, 27, ColorConst.Tenth);

            drawAt = new Steema.TeeChart.Drawing.PointDouble(series1.XValues.Maximum, 20);

            series1.MultiBar = MultiBars.SelfStack;

            tChart1.Axes.Left.Automatic = false;
            tChart1.Axes.Left.AutomaticMaximum = false;
            tChart1.Axes.Left.AutomaticMinimum = false;

            tChart1.Axes.Left.Maximum = 200;
            tChart1.Axes.Left.Minimum = -30;

            tChart1.Axes.Bottom.Automatic = false;
            tChart1.Axes.Bottom.AutomaticMaximum = false;
            tChart1.Axes.Bottom.AutomaticMinimum = false;

            tChart1.Axes.Bottom.Maximum = 10;
            tChart1.Axes.Bottom.Minimum = 0;

            tChart1.GetAxisLabel += tChart1_GetAxisLabel;
        }

        void tChart1_GetAxisLabel(object sender, GetAxisLabelEventArgs e)
        {
          double temp = Convert.ToDouble(e.LabelText);

          if (sender.Equals(tChart1.Axes.Left))
          {
            temp += drawAt.Y;
          }
          else if (sender.Equals(tChart1.Axes.Bottom))
          {
            temp += drawAt.X;
          }

          e.LabelText = temp.ToString();
        }

		private void CreateChart()
		{               
            tChart1 = new TChart();
            tChart1.Dock = DockStyle.Fill;
            tblPanel.Controls.Add(tChart1, 0, 1);
            tblPanel.Dock = DockStyle.Fill;
		}       

        private void btnModify_Click_1(object sender, EventArgs e)
        {
            tChart1.ShowEditor();
        }
	}

    public class ColorConst
    {
        public static readonly Color First = Color.FromArgb(219, 219, 219);
        public static readonly Color Second = Color.FromArgb(222, 216, 218);
        public static readonly Color Third = Color.FromArgb(184, 186, 216);
        public static readonly Color Forth = Color.FromArgb(209, 185, 189);
        public static readonly Color Fifth = Color.FromArgb(142, 149, 189);
        public static readonly Color Sixth = Color.FromArgb(201, 147, 151);
        public static readonly Color Seventh = Color.FromArgb(90, 102, 166);
        public static readonly Color Eight = Color.FromArgb(174, 82, 98);
        public static readonly Color Nineth = Color.FromArgb(22, 45, 160);
        public static readonly Color Tenth = Color.FromArgb(155, 0, 69);
    }
}

Re: Start position for bar series

Posted: Thu Feb 20, 2014 1:47 pm
by 16068452
Thanks Narcis for the workaround. It works well provided that there is only one stacked bar series.
If chart has another series, it would also be affected with this change.

In our scenario, we do have another series and we want to apply this change to bar only.
To illustrate this, have a look at attached snaps: one is before changing axis labels, another snap shows chart after changing labels which is fine for bar but not intended for error series.

Can we just shift bar starting position to desired location and keep other series unaffected? We tried it using custom right axis for bar but haven’t succeeded in it?
Please suggest.

Thanks,
Chandran

Re: Start position for bar series

Posted: Fri Feb 21, 2014 10:59 am
by Christopher
Chandran,
chandran wrote:Can we just shift bar starting position to desired location and keep other series unaffected? We tried it using custom right axis for bar but haven’t succeeded in it?
Please suggest.
I don't think the self-stacked bar style is going to do this for you, as the XValue is always set to the index of the series in the tChart1.Series collection, that is, zero in this case. An alternative would be to use several different bar series with a stacked style, e.g.

Code: Select all

using System;
using System.Drawing;
using System.Windows.Forms;
using Steema.TeeChart;
using Steema.TeeChart.Styles;
using System.Collections.Generic;

namespace WindowsFormsApplication2
{
  public partial class Form1 : Form
  {
    TChart tChart1;

    public Form1()
    {
      InitializeComponent();
      CreateChart();
      InitializeChart();
    }

    Bar series1;
    Points series2;
    Steema.TeeChart.Drawing.PointDouble drawAt;

    private void InitializeChart()
    {
      tChart1.Aspect.View3D = false;
      series2 = new Points(tChart1.Chart);

      series2.Add(10, 10);
      Random rnd = new Random();

      for (int i = 0; i < ColorConst.List.Count - 1; i++)
      {
        Bar series = new Bar(tChart1.Chart);
        series.BarWidthPercent = 15;
        series.Marks.Visible = false;
        series.Add(4, rnd.Next(5, 40), ColorConst.List[i]);
        series.MultiBar = MultiBars.Stacked;
      }


      //series1.Add(4, 10, ColorConst.First);
      //series1.Add(4, 5, ColorConst.Second);
      //series1.Add(4, 20, ColorConst.Third);
      //series1.Add(4, 30, ColorConst.Forth);
      //series1.Add(4, 5, ColorConst.Fifth);
      //series1.Add(4, 40, ColorConst.Sixth);
      //series1.Add(4, 25, ColorConst.Seventh);
      //series1.Add(4, 10, ColorConst.Eight);
      //series1.Add(4, 23, ColorConst.Nineth);
      //series1.Add(4, 27, ColorConst.Tenth);
      //series1.MultiBar = MultiBars.SelfStack;


      //drawAt = new Steema.TeeChart.Drawing.PointDouble(series1.XValues.Maximum, 20);


      tChart1.Axes.Left.Automatic = false;
      tChart1.Axes.Left.AutomaticMaximum = false;
      tChart1.Axes.Left.AutomaticMinimum = false;

      tChart1.Axes.Left.Maximum = 200;
      tChart1.Axes.Left.Minimum = -30;

      tChart1.Axes.Bottom.Automatic = false;
      tChart1.Axes.Bottom.AutomaticMaximum = false;
      tChart1.Axes.Bottom.AutomaticMinimum = false;

      tChart1.Axes.Bottom.Maximum = 10;
      tChart1.Axes.Bottom.Minimum = 0;

      //tChart1.GetAxisLabel += tChart1_GetAxisLabel;
    }

    void tChart1_GetAxisLabel(object sender, GetAxisLabelEventArgs e)
    {
      double temp = Convert.ToDouble(e.LabelText);

      if (sender.Equals(tChart1.Axes.Left))
      {
        temp += drawAt.Y;
      }
      else if (sender.Equals(tChart1.Axes.Bottom))
      {
        temp += drawAt.X;
      }

      e.LabelText = temp.ToString();
    }

    private void CreateChart()
    {
      tChart1 = new TChart();
      tChart1.Dock = DockStyle.Fill;
      tblPanel.Controls.Add(tChart1, 0, 1);
      tblPanel.Dock = DockStyle.Fill;
    }

    private void btnModify_Click_1(object sender, EventArgs e)
    {
      tChart1.ShowEditor();
    }
  }

  public class ColorConst
  {
    public static readonly Color First = Color.FromArgb(219, 219, 219);
    public static readonly Color Second = Color.FromArgb(222, 216, 218);
    public static readonly Color Third = Color.FromArgb(184, 186, 216);
    public static readonly Color Forth = Color.FromArgb(209, 185, 189);
    public static readonly Color Fifth = Color.FromArgb(142, 149, 189);
    public static readonly Color Sixth = Color.FromArgb(201, 147, 151);
    public static readonly Color Seventh = Color.FromArgb(90, 102, 166);
    public static readonly Color Eight = Color.FromArgb(174, 82, 98);
    public static readonly Color Nineth = Color.FromArgb(22, 45, 160);
    public static readonly Color Tenth = Color.FromArgb(155, 0, 69);

    public static readonly List<Color> List = new List<Color>() { First, Second, Third, Forth, Fifth, Sixth, Seventh, Eight, Nineth, Tenth };
  }
}
This gives me the attached image (the points series here just a placeholder for a second series):
chandran.PNG
chandran.PNG (15.97 KiB) Viewed 14814 times