Page 1 of 1

Labels in between points in line chart

Posted: Mon Apr 26, 2010 7:37 am
by 6924564
I need to get two things in my Line graph. Attached is a sample to show what I am looking for.

1. Is it possible to have label in between the points? In my eg:- lables like "AAA","BBB" etc.
2. To have labels in my X-axis (I need to put text as labels). In my eg: - "Start","Point1","Point2" etc.

If I add using Chart.Series(0).Add 20, "AAA", RGB(0, 64, 128) Then "AAA" comes near the point.

I was able to do the 2nd requirement using .Axis.Bottom.labels.Style = talMark.
I need a combination of points 1 and 2.
Can you tell me what settings I need to do to set this.

Any help on this will be really helpfull.

Thanks
CS

Re: Labels in between points in line chart

Posted: Mon Apr 26, 2010 8:23 am
by yeray
Hi CS,

You could use the points labels for the bottom axis labels (Start, Point 1,...) and annotation tools (or custom drawing techniques) for the labels between the points (AAA, BBB,...). For example:

Code: Select all

Private Sub Form_Load()
  TChart1.Aspect.View3D = False
  
  TChart1.AddSeries scLine
  TChart1.Series(0).asLine.Pointer.Visible = True
  
  Dim i As Integer
  TChart1.Series(0).Add Rnd * 100, "Open", clTeeColor
  For i = 1 To 3
    TChart1.Series(0).Add TChart1.Series(0).YValues.Value(i - 1) + Rnd * 10 - 5, "Point " + Str$(i), clTeeColor
  Next i
  TChart1.Series(0).Add TChart1.Series(0).YValues.Value(i - 1) + Rnd * 10 - 5, "Close", clTeeColor
  
  TChart1.Environment.InternalRepaint
  
  For i = 0 To TChart1.Series(0).Count - 2
    TChart1.Tools.Add tcAnnotate
    With TChart1.Tools.Items(i).asAnnotation
      .Text = Chr(65 + i) + Chr(65 + i) + Chr(65 + i)
      .Left = ((TChart1.Series(0).CalcXPos(i + 1) - TChart1.Series(0).CalcXPos(i)) / 2) + TChart1.Series(0).CalcXPos(i) - (TChart1.Canvas.TextWidth(.Text) / 2)
      .Top = ((TChart1.Series(0).CalcYPos(i + 1) - TChart1.Series(0).CalcYPos(i)) / 2) + TChart1.Series(0).CalcYPos(i) - (TChart1.Canvas.TextHeight(.Text) / 2)
      .Shape.Transparent = True
    End With
  Next i
End Sub

Re: Labels in between points in line chart

Posted: Tue Apr 27, 2010 3:05 am
by 6924564
Hi Yeray,

In my version I am not getting ".Left " and ".Top " With TChart1.Tools.Items(i).asAnnotation

Various property I can see are ".Position", ".Text", ".Shape". Is there any other way to set the position.
Thanks
CS

Re: Labels in between points in line chart

Posted: Tue Apr 27, 2010 8:35 am
by yeray
Hi CS,

What TeeChart version are you using? Here is works with both v7 and v8.

Re: Labels in between points in line chart

Posted: Wed Apr 28, 2010 5:59 am
by 6924564
Hi Yeray,

version 5.

used "TeeChart5Activex.exe" for installation. We are calling the tchart componets from VB 6.

Thanks
CS

Re: Labels in between points in line chart

Posted: Thu Apr 29, 2010 9:51 am
by yeray
Hi CS,

In TeeChart v5 you can do it with .asAnnotation.Shape.Left and .asAnnotation.Shape.Top instead of .asAnnotation.Left and .asAnnotation.Top.

Re: Labels in between points in line chart

Posted: Thu Sep 30, 2010 10:36 am
by 6924564
Hi,

With the Code you provided I can plot the text in between the points.

Can I cange the Font of the Text which I am plotting.

Also I want to draw a rectangle or square around this label and need an ability to set the color of the Border.

Thanks CS

Re: Labels in between points in line chart

Posted: Thu Sep 30, 2010 3:04 pm
by yeray
Hi CS,

In the example above, with annotation tools, you can set their font and other settings, for example, as follows:

Code: Select all

  For i = 0 To TChart1.Series(0).Count - 2
    TChart1.Tools.Add tcAnnotate
    With TChart1.Tools.Items(i).asAnnotation
      .Text = Chr(65 + i) + Chr(65 + i) + Chr(65 + i)
      .Left = ((TChart1.Series(0).CalcXPos(i + 1) - TChart1.Series(0).CalcXPos(i)) / 2) + TChart1.Series(0).CalcXPos(i) - (TChart1.Canvas.TextWidth(.Text) / 2)
      .Top = ((TChart1.Series(0).CalcYPos(i + 1) - TChart1.Series(0).CalcYPos(i)) / 2) + TChart1.Series(0).CalcYPos(i) - (TChart1.Canvas.TextHeight(.Text) / 2)
      .Shape.Shadow.Visible = False
      
      If (i = 2) Then
        .Shape.Font.Color = vbRed
        .Shape.Font.Size = 12
        .Shape.Font.Bold = True
        .Shape.Font.Name = "Comic Sans MS"
      End If
    End With
  Next i
However, the following property in VCL seems not to be implemented in ActiveX. I've adde it to the wish list to be implemented in future releases (TA05015185):

Code: Select all

ChartTool1.Shape.Brush.Style:=bsClear;

Re: Labels in between points in line chart

Posted: Fri Oct 29, 2010 6:29 am
by 6924564
I tried to use Annotation but I am not able to plot Annotation in the middle of the points.
It works fine when I run the cod eand view the output but when I Export that image to jpeg the points are not on the same Location.
Also I have attached both the screenshot.
Following is Code whcih I am using for Graph generation :

Private Sub Command1_Click()
With TChart1.Export.asGIF
.Width = 850
.Height = 300
.SaveToFile ("C:\Test.gif")
End With
End Sub

Private Sub Form_Load()
TChart1.ClearChart
With TChart1
.AddSeries (scLine)
.Series(0).Clear
'.Series(0).Marks.Visible = True
.Panel.Color = vbWhite
.Panel.BevelOuter = bvNone
.Panel.Gradient.Visible = False

.Header.Text.Clear
'.Header.Text.Add m_sHeader
.Header.Font.Color = vbRed
.Header.Font.Bold = False
.Header.Font.Name = "Verdana"
.Header.Font.Size = 8

.Tools.Clear
.Footer.Text.Clear
.Footer.Text.Add m_sFooter
.Legend.Visible = False
.Legend.TextStyle = ltsLeftValue
.Legend.Font.Color = vbBlack
.Legend.Font.Name = "Verdana"
.Legend.Font.Size = 8
.Legend.ShapeStyle = fosRoundRectangle
.Legend.ShadowSize = 0

.Walls.Visible = False
.Aspect.View3D = False

.Axis.Left.Title.Caption = "Bps from Arrival Price"
.Axis.Left.Title.Font.Bold = True
.Axis.Left.Title.Font.Name = "Verdana"
.Axis.Left.Title.Font.Size = 10
.Axis.Left.Title.Font.Color = vbBlack

.Axis.Left.AxisPen.Color = RGB(51, 51, 51)
.Axis.Left.labels.Font.Color = vbBlack
.Axis.Left.labels.Font.Name = "Verdana"
.Axis.Left.labels.Font.Size = 8
.Axis.Left.labels.Font.Bold = False
.Axis.Left.GridPen.Visible = False

.Axis.Bottom.AxisPen.Color = RGB(77, 77, 77)
.Axis.Bottom.labels.Font.Name = "Verdana"
.Axis.Bottom.labels.Font.Size = 8
.Axis.Bottom.labels.Font.Color = vbWhite
.Axis.Bottom.labels.OnAxis = False
.Axis.Bottom.Title.Caption = m_sXAxisTitle
.Axis.Bottom.Title.Font.Bold = False
.Axis.Bottom.Title.Font.Color = vbBlack
.Axis.Bottom.GridPen.Visible = True
.Axis.Bottom.GridPen.Style = psSolid
.Axis.Bottom.GridPen.Color = RGB(143, 143, 143)

.Axis.Right.Visible = True
.Axis.Right.AxisPen.Color = RGB(77, 77, 77)
.Axis.Right.labels.Font.Name = "Verdana"
.Axis.Right.labels.Font.Size = 8
.Axis.Right.Title.Caption = m_sXAxisTitle
.Axis.Right.Title.Font.Bold = False
.Axis.Right.Title.Font.Color = vbBlack
.Axis.Right.GridPen.Visible = False

.Axis.Top.Visible = False
.Axis.Top.AxisPen.Color = RGB(77, 77, 77)
.Axis.Top.labels.Visible = False
End With



'TChart1.Aspect.View3D = False
'TChart1.ClearChart
TChart1.AddSeries scLine
TChart1.Series(0).asLine.Pointer.Visible = True

m_lMinLeftAxis = 0
m_lMaxLeftAxis = 0
Dim Point1, Point2, Point3, Point4, Point4TPlusOne, Point4TPlusFive
Dim zeroCorrectingFigure, tmpNumber
tmpNumber = 0
zeroCorrectingFigure = 0
With TChart1
Dim points, labels, i, calcMethodType, CalcCol
.Series(0).asLine.LinePen.Width = 1
.Series(0).asLine.LinePen.Style = psSolid
.Series(0).asLine.LinePen.EndStyle = esFlat
.Axis.Bottom.labels.Visible = True
.Axis.Bottom.labels.Font.Name = "Arial"
.Axis.Bottom.labels.Font.Size = 8
.Axis.Bottom.labels.OnAxis = True
.Axis.Bottom.labels.Font.Color = vbBlack
.Axis.Bottom.labels.Style = talText
.Axis.Bottom.MinorTicks.Visible = False
Point1 = -81.11
Point2 = -90.45
Point3 = 23.9
Point4 = 57.87
Point4TPlusOne = 22.88
Point4TPlusFive = -15.23

.Series(0).Add Round(Point1, 2), "P1", RGB(0, 64, 128)
If m_lMinLeftAxis > Point1 Then m_lMinLeftAxis = Point1
If m_lMaxLeftAxis < Point1 Then m_lMaxLeftAxis = Point1
m_lMaxBottomAxis = m_lMaxBottomAxis + 1

.Series(0).Add Round(Point2, 2), "P2", RGB(0, 64, 128)
If m_lMinLeftAxis > Point2 Then m_lMinLeftAxis = Point2
If m_lMaxLeftAxis < Point2 Then m_lMaxLeftAxis = Point2
m_lMaxBottomAxis = m_lMaxBottomAxis + 1

.Series(0).Add 0, "P3", RGB(0, 64, 128)
m_lMaxBottomAxis = m_lMaxBottomAxis + 1

.Series(0).Add Round(Point3, 2), "P4", RGB(0, 64, 128)
If m_lMinLeftAxis > Point3 Then m_lMinLeftAxis = Point3
If m_lMaxLeftAxis < Point3 Then m_lMaxLeftAxis = Point3
m_lMaxBottomAxis = m_lMaxBottomAxis + 1

.Series(0).Add Round(Point4, 2), "P5", RGB(0, 64, 128)
If m_lMinLeftAxis > Point4 Then m_lMinLeftAxis = Point4
If m_lMaxLeftAxis < Point4 Then m_lMaxLeftAxis = Point4
m_lMaxBottomAxis = m_lMaxBottomAxis + 1

.Series(0).Add Round(Point4TPlusOne, 2), "P6", RGB(0, 64, 128)
If m_lMinLeftAxis > Point4TPlusOne Then m_lMinLeftAxis = Point4TPlusOne
If m_lMaxLeftAxis < Point4TPlusOne Then m_lMaxLeftAxis = Point4TPlusOne
m_lMaxBottomAxis = m_lMaxBottomAxis + 1

.Series(0).Add Round(Point4TPlusFive, 2), "P7", RGB(0, 64, 128)
If m_lMinLeftAxis > Point4TPlusFive Then m_lMinLeftAxis = Point4TPlusFive
If m_lMaxLeftAxis < Point4TPlusFive Then m_lMaxLeftAxis = Point4TPlusFive
m_lMaxBottomAxis = m_lMaxBottomAxis + 1


.Series(0).VerticalAxis = aBothVertAxis
.Series(0).asLine.Pointer.Visible = True
.Series(0).asLine.Pointer.Style = psCircle

With .Axis.Left
.SetMinMax m_lMinLeftAxis, m_lMaxLeftAxis + 20
If (((m_lMaxLeftAxis + 20) - (m_lMinLeftAxis - 5)) / 6) > 0 Then
.Increment = Int(((m_lMaxLeftAxis + 20) - (m_lMinLeftAxis - 5)) / 6)
End If
End With
With .Axis.Bottom
.labels.Visible = True
.labels.OnAxis = True
.SetMinMax 0, m_lMaxBottomAxis
End With
With .Axis.Right
.SetMinMax m_lMinLeftAxis, m_lMaxLeftAxis + 20
If (((m_lMaxLeftAxis + 20) - (m_lMinLeftAxis - 5)) / 6) > 0 Then
.Increment = Int(((m_lMaxLeftAxis + 20) - (m_lMinLeftAxis - 5)) / 6)
End If
End With







End With

TChart1.Environment.InternalRepaint

For i = 0 To TChart1.Series(0).Count - 2
TChart1.Tools.Add tcAnnotate
With TChart1.Tools.Items(i).asAnnotation
.Text = "Test"
.Shape.Left = ((TChart1.Series(0).CalcXPos(i + 1) - TChart1.Series(0).CalcXPos(i)) / 2) + TChart1.Series(0).CalcXPos(i) - (TChart1.Canvas.TextWidth(.Text) / 2)
.Shape.Top = ((TChart1.Series(0).CalcYPos(i + 1) - TChart1.Series(0).CalcYPos(i)) / 2) + TChart1.Series(0).CalcYPos(i) - (TChart1.Canvas.TextHeight(.Text) / 2)
.Shape.Transparent = False
End With
Next i
End Sub
LineGraphExport.gif
LineGraphExport.gif (22.39 KiB) Viewed 14317 times
LineGraph.JPG
LineGraph.JPG (28.38 KiB) Viewed 14336 times

Re: Labels in between points in line chart

Posted: Tue Nov 02, 2010 8:57 am
by narcis
Hi CS,

You could try exporting the chart to an image using TChart1.Canvas.StretchDraw method.

Re: Labels in between points in line chart

Posted: Thu Nov 11, 2010 3:59 am
by 6924564
Hi,

I am using TChart Version 5 in Visual Basis.
I can't find StretchDraw Method in this version.

Can you give me some other solution to fix this.

CS

Re: Labels in between points in line chart

Posted: Fri Nov 12, 2010 8:47 am
by narcis
Hi CS,

StretchDraw is available in v2010 (aka v9). Many new features and enhancements have been added since v5 was released. We strongly recommend you to have a look at v2010's fully functional evaluation version available at http://www.steema.com/evaluation/ax.

An alternative to StretchDraw, which can be done in v5 too is positioning object in the OnBeforeDrawSeries event. Doing so exports tools correctly. You should remove the code where you add tools and do something like this:

Code: Select all

Private Sub TChart1_OnBeforeDrawSeries()
TChart1.Tools.Clear
For i = 0 To TChart1.Series(0).Count - 2
TChart1.Tools.Add tcAnnotate
With TChart1.Tools.Items(i).asAnnotation
.Text = "Test"
.Shape.CustomPosition = True
.Shape.Left = ((TChart1.Series(0).CalcXPos(i + 1) - TChart1.Series(0).CalcXPos(i)) / 2) + TChart1.Series(0).CalcXPos(i) - (TChart1.Canvas.TextWidth(.Text) / 2)
.Shape.Top = ((TChart1.Series(0).CalcYPos(i + 1) - TChart1.Series(0).CalcYPos(i)) / 2) + TChart1.Series(0).CalcYPos(i) - (TChart1.Canvas.TextHeight(.Text) / 2)
.Shape.Transparent = False
End With
Next i