Page 1 of 1

ErrorBar with min and max values

Posted: Fri Apr 13, 2012 10:33 am
by 15661292
Hi,

I am trying to add error bars to bar graphs presenting minimum and maximum. I understand that the upper and lower errorbar are always in equal size, and that makes sense charting errors. The distance between mean to minimum, and between mean and maximum are not always equal, in most cases unequal. So I declare two errorbars, upper and lower to chart maximum and minimum respectively. Unfortunetely, the two errorbars are displayed offset from each other. Is there a way to bring both in line?

Cheers
Oli

Here my code:

Dim ErrorbarMin As New Steema.TeeChart.Styles.Error()
Dim ErrorbarMax As New Steema.TeeChart.Styles.Error()


ErrorbarMax.Add(i, GraphData_Mean(i), GraphData_Max(i) - GraphData_Mean(i), labels(i))
ErrorbarMin.Add(i, GraphData_Mean(i), GraphData_Mean(i) - GraphData_Min(i), labels(i))

ErrorbarMax.Color = Color.Black
ErrorbarMax.HorizAxis = HorizontalAxis.Bottom
ErrorbarMax.ErrorPen.Visible = True
ErrorbarMax.ErrorPen.Width = 2
ErrorbarMax.ErrorPen.Color = Color.Black
ErrorbarMax.ErrorPen.Style = Drawing2D.DashStyle.Solid
ErrorbarMax.ErrorWidthUnits = ErrorWidthUnits.Percent
ErrorbarMax.ErrorWidth = 65
ErrorbarMax.ErrorStyle = ErrorStyles.Top
ErrorbarMax.Title = "Error bar, upper"

ErrorbarMin.Color = Color.Black
ErrorbarMin.HorizAxis = HorizontalAxis.Bottom
ErrorbarMin.ErrorPen.Visible = True
ErrorbarMin.ErrorPen.Width = 2
ErrorbarMin.ErrorPen.Color = Color.Black
ErrorbarMin.ErrorPen.Style = Drawing2D.DashStyle.Solid
ErrorbarMin.ErrorWidthUnits = ErrorWidthUnits.Percent
ErrorbarMin.ErrorWidth = 65
ErrorbarMin.ErrorStyle = ErrorStyles.Bottom
ErrorbarMin.Title = "Error bar, lower"

tChart.Series.Add(ErrorbarMax)
tChart.Series.Add(ErrorbarMin)
MinMaxErrorBar.PNG
MinMaxErrorBar.PNG (13.81 KiB) Viewed 10216 times

Re: ErrorBar with min and max values

Posted: Fri Apr 13, 2012 1:58 pm
by 10050769
Hello Oli,

Can you please, send us a complete example where we can help you to achieve as you want?

Thanks,

Re: ErrorBar with min and max values

Posted: Sun Apr 15, 2012 10:22 pm
by 15661292
Hi Sandra,

I have attached a small example project to demonstrate the offset of two errorbars added to one bar. I would like to have the two errorbars aligned.

I am also wondering why the font size of labels in bottom and left axis is different, although I set both to a size of 11. :?:

Please let me know if you require further details on what I am trying to achieve. Thanks for your support :)

Cheers
Oli

Re: ErrorBar with min and max values

Posted: Mon Apr 16, 2012 12:29 pm
by 10050769
Hello Oli,

Ok. I have made a simple code using a ErrorBar Series and Error Series where the errorbars are displayed in line

Code: Select all

   Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        ' Initialize chart
        InitializeChart()

        Dim GraphXAxisTitle(2) As String
        GraphXAxisTitle = New String() {"A", "B", "C"}

        Dim GraphData(4, 2) As Double
        GraphData = New Double(,) {{1, 2, 3, 4, 5}, {8, 9, 11, 12, 15}, {22, 19, 21, 23, 17}}

        Dim GraphData_Mean(2) As Double
        GraphData_Mean(0) = 3
        GraphData_Mean(1) = 11
        GraphData_Mean(2) = 34

        Dim GraphData_Max(2) As Double
        GraphData_Max(0) = 5
        GraphData_Max(1) = 15
        GraphData_Max(2) = 23

        Dim GraphData_Min(2) As Double
        GraphData_Min(0) = 1
        GraphData_Min(1) = 8
        GraphData_Min(2) = 17

        ' Clearing  and Setting tchart1 properties
        tChart.Series.Clear()
        tChart.Axes.Bottom.Labels.Items.Clear()

        ' The labels for vertical axis
        Dim Ylabel(0) As String
        Ylabel(0) = "Y Title"
        tChart.Axes.Left.Title.Lines = Ylabel
        tChart.Axes.Left.Title.Text = Ylabel(0)
        tChart.Axes.Left.Title.Visible = True

        ' The labels for the chart
        Dim labels(GraphXAxisTitle.Length - 1) As String
        For i = 0 To GraphXAxisTitle.Length - 1
            labels(i) = GraphXAxisTitle(i)
        Next

        ' Set titles of graph
        tChart.Header.Text = "MinMax ErrorBar"
        tChart.Header.Visible = True
        tChart.Legend.Visible = False
        ' Set Axes
        tChart.Axes.Left.MinorTickCount = 0
        tChart.Axes.Left.Automatic = True
        tChart.Axes.Left.Labels.Font.Size = 11
        tChart.Axes.Bottom.MinorTickCount = 0
        tChart.Axes.Bottom.Automatic = True
        tChart.Axes.Bottom.Labels.Font.Size = 11
        tChart.Axes.Bottom.MinimumOffset = 50
        tChart.Axes.Bottom.MaximumOffset = 50
        tChart.Axes.Left.MinimumOffset = 0
        tChart.Axes.Top.Automatic = True
        tChart.Axes.Top.Visible = False
        tChart.Axes.Top.MinimumOffset = 50
        tChart.Axes.Top.MaximumOffset = 50

        For i = 0 To 2

            Dim errorBar As New Steema.TeeChart.Styles.ErrorBar(tChart.Chart)
            Dim error1 As New Steema.TeeChart.Styles.Error(tChart.Chart)
            'Error Bar Series
            errorBar.Pen.Color = Color.Black
            errorBar.ErrorPen.Width = 2
            errorBar.Brush.Solid = True
            errorBar.Brush.Color = Color.White
            errorBar.Title = labels(i)
            errorBar.Marks.Visible = False
            errorBar.ErrorStyle = ErrorStyles.Top
            errorBar.HorizAxis = HorizontalAxis.Bottom
            errorBar.MultiBar = MultiBars.None
            errorBar.Add(i, GraphData_Mean(i), GraphData_Max(i) - GraphData_Mean(i), labels(i))
            errorBar.BarWidthPercent = 40
            tChart.Axes.Bottom.Labels.Items.Add(i, errorBar.Title)
            ' Error Series 
            error1.ErrorPen.Width = 2
            error1.Brush.Solid = True
            error1.Color = Color.Black
            error1.Marks.Visible = False
            error1.Title = labels(i)
            error1.ErrorStyle = ErrorStyles.Bottom
            error1.HorizAxis = HorizontalAxis.Top
            error1.MultiBar = MultiBars.None
            error1.ShowInLegend = False
            error1.Add(i, GraphData_Mean(i), GraphData_Mean(i) - GraphData_Min(i), labels(i))
            error1.BarWidthPercent = 40
        Next
        tChart.Chart.Tag = "MeanBarError"
        Me.Controls.Add(tChart)
    End Sub
Can you tell us if previous code works as you want?

Thanks,

Re: ErrorBar with min and max values

Posted: Wed Apr 18, 2012 11:04 pm
by 15661292
Hi Sandra,

your code works as long as I am using bar charts. Another type of charts I do in my application is a simple line with errorbars. I create the line with box plot, and set the box and whisker invisible, and the meanline to visible. Then I add two errorss, one for minimum and the other for maximum value. See attachment.

Is the behavior to offsetting the errors expected, or a bug which could be fixed in the near future?

And in your code, the font size of left and bottom axis seems to be different too, even so both are set to a size of 11. Any idea why?

Thanks again

Oli

Re: ErrorBar with min and max values

Posted: Thu Apr 19, 2012 11:53 am
by 10050769
Hello Oli,

I suggest do something as next code to achieve as you want:

Code: Select all

   Public Sub New()

        ' This call is required by the Windows Form Designer.
        InitializeComponent()
        InitializeChart()

        ' Add any initialization after the InitializeComponent() call.

    End Sub
    Private boxSeries1 As Steema.TeeChart.Styles.Box, boxSeries2 As Steema.TeeChart.Styles.Box, boxSeries3 As Steema.TeeChart.Styles.Box
    Private error1 As Steema.TeeChart.Styles.Error, error2 As Steema.TeeChart.Styles.Error
    Private Sub InitializeChart()

        TChart1.Aspect.View3D = False
        TChart1.Panel.MarginBottom = 10
        boxSeries1 = New Box(TChart1.Chart)
        boxSeries2 = New Box(TChart1.Chart)
        boxSeries3 = New Box(TChart1.Chart)
        error1 = New [Error](TChart1.Chart)
        error2 = New [Error](TChart1.Chart)

        'BoxSeries1
        boxSeries1.Add(New Double(5) {321, 625, 810, 150, 190, 210})
        boxSeries1.Position = 0
        CustomizeBoxSeries(boxSeries1)
        boxSeries1.Title = "A"
        boxSeries2.Add(New Double(3) {256, 456, 120, 78})
        boxSeries2.Position = 1
        CustomizeBoxSeries(boxSeries2)
        boxSeries2.Title = "B"
        boxSeries3.Add(New Double(4) {306, 100, 201, 789, 861})
        boxSeries3.Position = 2
        CustomizeBoxSeries(boxSeries3)
        boxSeries3.Title = "C"

        'Error1

        error1.Add(boxSeries1.Position, CalculateMedian(boxSeries1), 50)
        error1.Add(boxSeries2.Position, CalculateMedian(boxSeries2), 30)
        error1.Add(boxSeries3.Position, CalculateMedian(boxSeries3), 63)
        error1.ErrorPen.Width = 2
        error1.Color = Color.Black
        error1.ErrorWidth = boxSeries1.Box.HorizSize / 2
        error1.ErrorStyle = ErrorStyles.Top
        error1.HorizAxis = HorizontalAxis.Top
        error1.MultiBar = MultiBars.None
        error1.ShowInLegend = False
        'Error2
        error2.Add(boxSeries1.Position, CalculateMedian(boxSeries1), -10)
        error2.Add(boxSeries2.Position, CalculateMedian(boxSeries2), -50)
        error2.Add(boxSeries3.Position, CalculateMedian(boxSeries3), -33)
        error2.ErrorPen.Width = 2
        error2.Color = Color.Black
        error2.ErrorWidth = boxSeries1.Box.HorizSize / 2
        error2.ErrorStyle = ErrorStyles.Bottom
        error2.HorizAxis = HorizontalAxis.Bottom
        error2.MultiBar = MultiBars.None
        error2.ShowInLegend = False

        'Axes
        TChart1.Axes.Top.Visible = False

        TChart1.Axes.Bottom.Labels.Items.Add(0, boxSeries1.Title)
        TChart1.Axes.Bottom.Labels.Items.Add(1, boxSeries2.Title)
        TChart1.Axes.Bottom.Labels.Items.Add(2, boxSeries3.Title)
        TChart1.Axes.Bottom.Labels.Font.Size = 15
        TChart1.Draw()
        TChart1.Draw()
        TChart1.Draw()
    End Sub

    Private Function CalculateMedian(ByVal series As Box) As Double
        Dim median As Double
        median = 0.0
        Dim N As Integer = series.SampleValues.Count
        If N > 0 Then
            Dim InvN As Double = 1.0 / N
            ' calculate median 

            Dim med As Integer = N \ 2
            If (N Mod 2) = 0 Then
                median = 0.5 * (series.SampleValues(med - 1) + series.SampleValues(med))
            Else
                median = series.SampleValues(med)
            End If
        End If
        Return median
    End Function
    Private Sub CustomizeBoxSeries(ByVal boxSeries As Box)
        boxSeries.MedianPen.Color = Color.Black
        boxSeries.MedianPen.Width = 2
        boxSeries.MedianPen.Style = System.Drawing.Drawing2D.DashStyle.Solid
        boxSeries.WhiskerPen.Visible = False
        boxSeries.ExtrOut.Visible = False
        boxSeries.MildOut.Visible = False
        boxSeries.Box.HorizSize = 50
        boxSeries.Box.Visible = False
    End Sub
And in your code, the font size of left and bottom axis seems to be different too, even so both are set to a size of 11. Any idea why?
Sorry I forgot answer it. When the labels are custom you need change the size for each label as do in next lines of code:

Code: Select all

     tChart1.Axes.Bottom.Labels.Items(0).Font.Size = 11;
            tChart1.Axes.Bottom.Labels.Items(1).Font.Size = 11;
            tChart1.Axes.Bottom.Labels.Items(2).Font.Size = 11;
I hope will helps.
Thanks,

Re: ErrorBar with min and max values

Posted: Sun Apr 22, 2012 11:34 am
by 15661292
Thanks Sandra. Errorbar with minimum and maximum (unsymmetric errorbars) works fine now on bars and boxplots. Many thanks for your help.

Oli

Re: ErrorBar with min and max values

Posted: Tue Apr 24, 2012 7:44 am
by 10050769
Hello Oli,

I am glad that my suggestion has been helpful for you. :)

Thanks,