Positioning Custom Vertical Axes

TeeChart for ActiveX, COM and ASP
Post Reply
nbp
Newbie
Newbie
Posts: 83
Joined: Mon Sep 18, 2006 12:00 am

Positioning Custom Vertical Axes

Post by nbp » Tue Mar 31, 2015 8:37 pm

I'm using TChart ActiveX version 7.

Trying to write code to position several vertical custom axes to the right of the chart. The number of these custom axes that will be added will be determined at runtime.

Following the general guidelines outlined in the link below:
http://stackoverflow.com/questions/1469 ... s-creation

However, using the code above, my axes are placed too close together and often an axis is superimposed on top of the title of the previous custom axes.

How do I find the size of the spacing in pixels to properly place a Custom Axis so that the following have been taken into account for the previous custom axis?

1) Length of tickmarks
2) Length of Labels
3) Separation between Labels and Title
4) Length of Title (angled at 90 degrees) to Axis so as to run along axis.

Yeray
Site Admin
Site Admin
Posts: 9534
Joined: Tue Dec 05, 2006 12:00 am
Location: Girona, Catalonia
Contact:

Re: Positioning Custom Vertical Axes

Post by Yeray » Wed Apr 01, 2015 10:49 am

Hello,

Here it is an example in VB6 considering TickLength, Labels.MaxWidth, the space between Labels and Title (extraPos) and Title length (both horizontal and vertical):

Code: Select all

Private Sub Form_Load() 
  TChart1.Aspect.View3D = False
  TChart1.Legend.CheckBoxes = True
  TChart1.Header.Visible = False
  TChart1.Legend.Alignment = laBottom
  TChart1.Panel.Color = RGB(192, 192, 192)
  
  Dim nSeries As Integer
  Dim i As Integer
  Dim vAxis As Integer
  
  nSeries = 5
  
  For i = 0 To nSeries - 1
    TChart1.AddSeries scLine
    TChart1.Series(i).FillSampleValues 25
    vAxis = TChart1.Axis.AddCustom(False)
    
    With TChart1.Axis.Custom(vAxis)
      .AxisPen.Color = TChart1.Series(i).Color
      .GridPen.Visible = False
      If i > 2 Then
        .Otherside = True
      End If
      .Title.Caption = "Axis Title " + Str$(i)
      .Title.Angle = 90
      .Title.Font.Color = TChart1.Series(i).Color
    End With
    
    TChart1.Series(i).VerticalAxisCustom = vAxis
    TChart1.Axis.Custom(vAxis).PositionUnits = puPixels
  Next i
  
  TChart1.Panel.MarginUnits = muPixels
  TChart1.Environment.InternalRepaint
End Sub

Private Sub PlaceAxis(ByVal nSeries As Integer, ByVal NextXLeft As Integer, ByVal NextXRight As Integer, ByVal MarginLeft As Integer, ByVal MarginRight As Integer)
  Const extraPos As Integer = 5
  'Variable
  Dim MaxLabelsWidth As Integer
  Dim lenghtTicks As Integer
  Dim titleMargin As Integer
  Dim margin As Integer
  
  If TChart1.Series(nSeries).Active Then
    MaxLabelsWidth = TChart1.Axis.Custom(nSeries).Labels.MaxWidth
    lenghtTicks = TChart1.Axis.Custom(nSeries).TickLength
    
    If TChart1.Axis.Custom(nSeries).Title.Angle = 90 Then
      titleMargin = TChart1.Canvas.TextHeight(TChart1.Axis.Custom(nSeries).Title.Caption)
    Else
      titleMargin = TChart1.Canvas.TextWidth(TChart1.Axis.Custom(nSeries).Title.Caption)
    End If
    
    margin = MaxLabelsWidth + lenghtTicks + titleMargin + extraPos
    
    If TChart1.Axis.Custom(nSeries).Otherside Then
      TChart1.Axis.Custom(nSeries).PositionPercent = NextXRight
      NextXRight = NextXRight - margin
      MarginRight = MarginRight + margin
    Else
      TChart1.Axis.Custom(nSeries).PositionPercent = NextXLeft
      NextXLeft = NextXLeft - margin
      MarginLeft = MarginLeft + margin
    End If

    TChart1.Panel.MarginLeft = MarginLeft
    TChart1.Panel.MarginRight = MarginRight
  End If
  
  nSeries = nSeries + 1

  If (nSeries <= TChart1.SeriesCount - 1) Then
    PlaceAxis nSeries, NextXLeft, NextXRight, MarginLeft, MarginRight
  End If
End Sub

Private Sub TChart1_OnAfterDraw()
  PlaceAxis 0, 0, 0, 5, 5
End Sub

Private Sub TChart1_OnClickLegend(ByVal Button As TeeChart.EMouseButton, ByVal Shift As TeeChart.EShiftState, ByVal X As Long, ByVal Y As Long)
  TChart1.Environment.InternalRepaint
End Sub
Best Regards,
ImageYeray Alonso
Development & Support
Steema Software
Av. Montilivi 33, 17003 Girona, Catalonia (SP)
Image Image Image Image Image Image Please read our Bug Fixing Policy

nbp
Newbie
Newbie
Posts: 83
Joined: Mon Sep 18, 2006 12:00 am

Re: Positioning Custom Vertical Axes

Post by nbp » Wed Apr 01, 2015 3:55 pm

Thanks. That worked for the most part.

I am using TChart ActiveX Pro Version 7. How do I get the width in pixels of the largest label for the axis? Labels.MaxWidth gives me the same number for each of my axes even though the labels are different in width. i.e. some have more decimal places in them than others. When the labels are long (more decimal places) the title for the custom axis seems to overlap the labels and or the next custom axis. So something somewhere in the calculation is not quite adding up.

Yeray
Site Admin
Site Admin
Posts: 9534
Joined: Tue Dec 05, 2006 12:00 am
Location: Girona, Catalonia
Contact:

Re: Positioning Custom Vertical Axes

Post by Yeray » Thu Apr 02, 2015 11:40 am

Hello,

I've modified the code in the post above with a couple of small fixes.
This is what I get with TeeChart ActiveX v7.0.1.4:
default.png
default.png (27.16 KiB) Viewed 15533 times
If I scroll the chart a bit to see a longer label for the yellow axis, I see the margin on the left gets bigger to fit the new:
scrolled.png
scrolled.png (22.86 KiB) Viewed 15524 times
Debugging I could also see the difference. MaxLabelsWidth for nSeries=2 is 21 without scrolling and 30 when the "1.000" label is shown.

If you still find problems with it, please try to arrange a simple example project we can run as-is to reproduce the problem here.
Best Regards,
ImageYeray Alonso
Development & Support
Steema Software
Av. Montilivi 33, 17003 Girona, Catalonia (SP)
Image Image Image Image Image Image Please read our Bug Fixing Policy

nbp
Newbie
Newbie
Posts: 24
Joined: Tue Apr 28, 2015 12:00 am

Re: Positioning Custom Vertical Axes

Post by nbp » Fri Jul 24, 2015 11:27 pm

Is there a reason to call PlaceAxis from the OnAfterDraw() method?

Narcís
Site Admin
Site Admin
Posts: 14730
Joined: Mon Jun 09, 2003 4:00 am
Location: Banyoles, Catalonia
Contact:

Re: Positioning Custom Vertical Axes

Post by Narcís » Mon Jul 27, 2015 7:21 am

Hi nbp,

That's to allow the chart to draw all elements so properties used in that method have been initialized and have valid values.
Best Regards,
Narcís Calvet / Development & Support
Steema Software
Avinguda Montilivi 33, 17003 Girona, Catalonia
Tel: 34 972 218 797
http://www.steema.com
Image Image Image Image Image Image
Instructions - How to post in this forum

Post Reply