我们想在图表上绘制一条最大值的线

时间:2015-10-19 06:53:13

标签: teechart

我们正在使用FastReport工具进行报告。 在这个报告中有一个teechart,我们想在一些条形图的最大值上绘制一条线。

Sample of a chart with line at maximum

我们尝试通过添加新系列来解决问题,但问题是该线路不是从x = 0开始。 我们怎样才能实现从x = 0开始的最大值线(在y轴之后)。

Example with series, not starting at x=0

绘制线条的代码示例:

void __fastcall TFTedPoro::cxButton2Click(TObject *Sender)
{
    double XMin, XMax, YVal;
    frxReport1->LoadFromFile("porocilo.fr3");

    TfrxChartView *cv;
    cv = (TfrxChartView *)frxReport1->FindObject("Chart1");
    if (cv != NULL)
    {
        cv->Chart->Series[0]->Marks->Visible = false;
        cv->Chart->Series[1]->Marks->Visible = false;
        cv->Chart->Series[2]->Marks->Visible = false;
        cv->Chart->Series[3]->Marks->Visible = false;
        cv->Chart->Series[4]->Marks->Visible = false;
        cv->Chart->Series[5]->Marks->Visible = false;
        cv->Chart->Series[6]->Marks->Visible = false;

        if (max_vred >= 350)
        {
            cv->Chart->LeftAxis->Maximum = max_vred;
        }
    }

    XMin = cv->Chart->Series[0]->XValues->MinValue;
    XMax = cv->Chart->Series[0]->XValues->MaxValue;
    YVal = cv->Chart->Series[0]->YValues->MaxValue;

    for (int i = 1; i < cv->Chart->SeriesCount()-1;i++)
    {
        XMin = Min(XMin, cv->Chart->Series[i]->XValues->MinValue);
        XMax = Max(XMax, cv->Chart->Series[i]->XValues->MaxValue);
        YVal = Max(YVal, cv->Chart->Series[i]->YValues->MaxValue);
    }
    cv->Chart->Series[8]->AddXY(XMin-1, YVal);
    cv->Chart->Series[8]->AddXY(XMax+1, YVal);
    cv->Chart->Axes->Bottom->SetMinMax(XMin-0.5, XMax+0.5);

    frxReport1->ShowReport(true);
}

结果如下: Chart with code on button click

1 个答案:

答案 0 :(得分:0)

使用功能演示中的示例中的TColorLineTool

ColorLine

功能演示附带TeeChart VCL evaluation version

<强>更新

如果您无法访问图表工具,则另一种方法是使用带有两个值的TLineSeries
请注意,您可以将其他系列中的第一个XValue缩小为最小XValue,将另一个系列中的XValue设置为大XValue。然后,您可以手动设置底部轴MinimumMaximum(即通过SetMinMax(min, max)功能)以仅适合原始系列中的点。

这是一个简单的例子:

uses Series, Math;

procedure TForm1.FormCreate(Sender: TObject);
var i: Integer;
    XMin, XMax, YVal: double;
begin
  for i:=0 to 7 do
  begin
    with Chart1.AddSeries(TBarSeries) as TBarSeries do
    begin
      Marks.Visible:=false;
      FillSampleValues();
    end;
  end;

  XMin:=Chart1[0].XValues.MinValue;
  XMax:=Chart1[0].XValues.MaxValue;
  YVal:=Chart1[0].YValues.MaxValue;
  for i:=1 to Chart1.SeriesCount-1 do
  begin
    XMin:=Min(XMin, Chart1[i].XValues.MinValue);
    XMax:=Max(XMax, Chart1[i].XValues.MaxValue);
    YVal:=Max(YVal, Chart1[i].YValues.MaxValue);
  end;

  with Chart1.AddSeries(TLineSeries) as TLineSeries do
  begin
    AddXY(XMin-1, YVal);
    AddXY(XMax+1, YVal);
  end;

  Chart1.Axes.Bottom.SetMinMax(XMin-0.5, XMax+0.5);
end;

这就是上面的例子在这里找我的方式:

Bars

第三种选择是在OnAfterDraw手动绘制一条水平线。即:

procedure TForm1.Chart1AfterDraw(Sender: TObject);
var Ythreshold: Double;
    tmpY: Integer;
begin
  Ythreshold:=Chart1[0].YValues.MaxValue;
  tmpY:=Chart1.Axes.Left.CalcPosValue(Ythreshold);
  Chart1.Canvas.Pen.Color:=clRed;
  Chart1.Canvas.Line(Chart1.Axes.Bottom.IStartPos, tmpY, Chart1.Axes.Bottom.IEndPos, tmpY);
end;