Page 1 of 1

Aligning multiple charts

Posted: Wed Aug 29, 2012 1:50 pm
by 10047857
Hi

I want to stack six charts vertically on top of each other. All the charts are for the same period and I have added a vertical chart tool to each chart to show the selected time. This works fine but the labels on the left axis are always a slightly different width so I can't alight the left wall of each chart. I have tried setting the panel width both by pixel and percentage but with no luck can anyone give me a clue?

The other thing I would like to is disable the labels from the 'inner' four charts but still show the grid. This too seems impossible - all I want to do is show the grid without either the bottom or top labels.

Bruce

Here is a screenshot:

Re: Aligning multiple charts

Posted: Wed Aug 29, 2012 2:15 pm
by yeray
Hi Bruce,

Give a look at the discussion that took place here:
http://www.teechart.net/support/viewtop ... rts#p53188

Re: Aligning multiple charts

Posted: Wed Aug 29, 2012 2:31 pm
by 10047857
Yeray

I'll have a look at the topic and see if I can make it work - what about the second question though having (vertical) grid lines without having the corresponding labels visible?

Bruce.

Re: Aligning multiple charts

Posted: Wed Aug 29, 2012 2:55 pm
by 10047857
Yeray

The label size property worked a treat. Still would like to disable the labels without disabling the grid though. Any thoughts???

Bruce.

Capture2.png
Capture2.png (38.26 KiB) Viewed 9871 times

Re: Aligning multiple charts

Posted: Thu Aug 30, 2012 8:55 am
by yeray
Hi Bruce,

To hide the labels, still showing the grid, you could use the OnGetAxisLabel event to assign an empty string to the desired labels.
Here it is a .NET example, but the same applies to VCL.
If you find any problem with it, don't hesitate to let us know.

Re: Aligning multiple charts

Posted: Sun Sep 02, 2012 4:37 pm
by 10047857
Yeray

Thanks for the link - I had a try at some of these work arounds and none of them work very satisfactorily.

I tried keeping the labels and using the same colored font for the test as the background. This works OK put appears on printing. Tried your suggestion of taking over the label drawing and painting nothing to the screen - the grid disappeared. I found you need to add a single space to get the grid back. Tried setting the label on axis to false which does help but why I don't know.

I thought the grid spacing was controlled by the amount and size of the text that makes up the label but now I'm not so sure. What I would like is grid and label separating so you can turn labels off and leave grid on.

I can't get the 6 graph I have stacked on top of each other to scale the grid exactly the same despite having the increments top and bottom the same. I'll keep working at it but the whole area needs reworking in my opinion and is a complete minefield!

Bruce.

Re: Aligning multiple charts

Posted: Tue Sep 04, 2012 10:05 am
by yeray
Hi Bruce,

I'm trying to reproduce it but I can't. Here you have the simple example project I'm using:

Code: Select all

var Chart1, Chart2: TChart;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Chart1:=TChart.Create(Self);
  Chart1.Parent:=Self;
  Chart1.Align:=alTop;

  Chart2:=TChart.Create(Self);
  Chart2.Parent:=Self;
  Chart2.Align:=alTop;

  Chart1.View3D:=false;
  Chart1.Legend.Visible:=false;
  Chart2.View3D:=false;
  Chart2.Legend.Visible:=false;

  Chart1.AddSeries(TFastLineSeries).FillSampleValues(100);
  Chart2.AddSeries(TBarSeries).FillSampleValues(100);
  Chart2[0].Marks.Visible:=false;

  Chart2.MarginBottom:=1;
  Chart2.Axes.Bottom.OnDrawLabel:=Chart1AxisDrawLabel;
  Chart2.Axes.Bottom.Ticks.Visible:=false;
  Chart2.Axes.Bottom.MinorTicks.Visible:=false;

  LeftAlignCharts([Chart1,Chart2],100,600);

  Chart1.Axes.Bottom.MinimumOffset:=5;
  Chart1.Axes.Bottom.MaximumOffset:=5;
  Chart2.Axes.Bottom.MinimumOffset:=5;
  Chart2.Axes.Bottom.MaximumOffset:=5;
end;

procedure TForm1.Chart1AxisDrawLabel(Sender:TChartAxis; var X,Y,Z:Integer;
                   var Text:String; var DrawLabel:Boolean);
begin
  if Sender = Chart2.Axes.Bottom then
    Text:=' ';
end;

procedure TForm1.LeftAlignCharts(Const Charts: Array of TCustomChart; aLeft: Integer; aWidth: Integer);
var i: Integer;
begin
  for i := Low(Charts) to High(Charts) do
  With Charts[i] do
  begin
    Left := aLeft;
    MarginLeft := 0;
    Width := aWidth;
    Axes.Left.TitleSize := 15;
    Axes.Left.LabelsSize := 30;
    Axes.Left.LabelsAlign := alDefault;
  end;
end;
The only problem I've found is that the TBarSeries applies an internal offset to the bottom axis minimum&maximum so the first and last bars can be completely shown. However, having the same number of values in both charts, the axis minimum, maximum and increment are automatically the same, so I don't need to manually set them.

If you still have problems with it, please try to modify the code above so we can reproduce the situation here.