2015-10-19 3 views
0

Мы используем инструмент FastReport для отчетности. В этом отчете есть teechart, где мы хотели бы нарисовать линию при максимальном значении некоторых гистограмм.Мы хотим нарисовать линию на максимальном значении на диаграмме

Sample of a chart with line at maximum

Мы попытались решить эту проблему с добавлением новых серий, но проблема в том, что линия не начинается при х = 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

+0

На изображении я вижу красную горизонтальную линию при y = 350. Я не уверен, чтобы понять, в чем проблема. Кажется, что красная линия начинается сразу после левой оси y. – Yeray

+0

Это то, чего мы хотели бы достичь, но мы не можем. Если мы добавим строки для строки, линия не начнется с x = 0 - см. Прикрепленное изображение выше –

ответ

0

Используйте TColorLineTool как в примере, в Особенности Demo:

ColorLine

Характерные особенности Демо поставляется с TeeChart VCL evaluation version:

Update:

Если у вас нет доступа к Chart Tools, другой подход был бы с помощью TLineSeries с два значения.
Обратите внимание, что вы можете установить первый XValue поменьше до наименьшего XValue в другой группе, а второй XValue больше, чем самый большой XValue в вашей другой серии. Затем вы можете вручную установить нижнюю ось Minimum и Maximum (т.е. через функцию 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; 
+0

Мы используем TeeChart с Fast report 4.15. В этом выпуске мы не смогли найти TColorLineTool. Вместо этого мы попытались использовать LineVIew, но проблема в том, что максимальное значение осей x динамически генерируется, поэтому положение строки не фиксировано. –

+0

Я отредактировал свой ответ, добавив две альтернативы. – Yeray

+0

Да, я видел, но я не понимаю, как реализовать свое решение с помощью TLineSeries. Я не уверен, где я могу установить первый и второй XValue, и я также не знаю, как установить Minimum и Maximum. –

Смежные вопросы