gpt4 book ai didi

delphi - 创建面积图,用其他颜色为溢出值的部分着色

转载 作者:行者123 更新时间:2023-12-03 15:23:52 25 4
gpt4 key购买 nike

你能帮我创建面积图,其中图表的部分(顶部)有其他颜色吗?我想指出的是,超过任何数值的值都是至关重要的。

这是一个截图: enter image description here

我创建了两个面积图,但正如您所看到的,每个图表都有自己的左轴。最好的解决方案是在特定值上方着色图表。

最佳答案

有一个名为 TSeriesBandTool 的工具,只需做一点工作即可完成此操作。

添加一个额外的系列并使其与您的系列相同,但具有最大限制。

这是它在工具编辑器中的样子:

enter image description here

它将用您选择的颜色填充两个系列之间的差异。

更新

进行了概念验证,请参见图片。

添加了第三个系列和第二个 TSeriesBandTool,以用第二种颜色填充底部。我确信可以用更少的代码来完成,但这对于演示来说已经足够了。

更新2

更新了一些代码。

更新2.5

现在还可以处理任意 X 值,而不仅仅是整数。

enter image description here

这是代码:

uses Series, TeeTools, TeeSeriesBandTool;

Procedure DrawLimitAreaChart(S1, S2, S3: TLineSeries; YLimit: Double;
BT1, BT2: TSeriesBandTool; OutlineWidth: Integer;
OutlineCL, TopCl, BottomCL: TColor);
Var
i: Integer;
iX: Double;
Begin
S1.LinePen.Width := OutlineWidth;
S1.Color := OutlineCL;
S2.Color := OutlineCL;
S3.Color := OutlineCL;
for i := 0 to S1.Count - 1 do
if (S1.YValue[i] > YLimit) then
begin
if (i > 0) and (S1.YValue[i - 1] < YLimit) then
begin // Last point below limit
iX := (S1.XValue[i] - S1.XValue[i - 1]) * (YLimit - S1.YValue[i - 1]) /
(S1.YValue[i] - S1.YValue[i - 1]) + S1.XValue[i - 1];
S2.AddXY(iX, YLimit);
if (i < S1.Count - 1) then
Continue;
end;
S2.AddXY(S1.XValue[i], YLimit); // Set to Ylimit
end
else // Below Ylimit
begin
if (i > 0) and (S1.YValue[i - 1] > YLimit) then
begin // Last point above limit
iX := (S1.XValue[i] - S1.XValue[i - 1]) * (YLimit - S1.YValue[i - 1]) /
(S1.YValue[i] - S1.YValue[i - 1]) + S1.XValue[i - 1];
S2.AddXY(iX, YLimit);
end;
S2.AddXY(S1.XValue[i], S1.YValue[i]); // Same value
end;

for i := 0 to S2.Count - 1 do
begin
S3.AddXY(S2.XValue[i], 0.0);
end;

{ - First TSeriesBandTool }
BT1.Series := S1;
BT1.Series2 := S2;
BT1.Brush.BackColor := TopCl;
BT1.DrawBehindSeries := True;
BT1.Transparency := 50;

{ - Second TSeriesBandTool }
BT2.Series := S2;
BT2.Series2 := S3;
BT2.Brush.BackColor := BottomCL;
BT2.DrawBehindSeries := True;
BT2.Transparency := 50;

End;

procedure TForm1.Button1Click(Sender: TObject);
const
// Example data
YVAL: array [0 .. 10] of Double = (10,40,45,20,48,5,47,47,47,47,30);
var
i: Integer;
YLimit: Double;
S1, S2, S3: TLineSeries;
begin
Chart1.SeriesList.Clear;
S1 := TLineSeries.Create(Self); // Contains real data
Chart1.AddSeries(S1);
S2 := TLineSeries.Create(Self); // Data below Ylimit
Chart1.AddSeries(S2);
S3 := TLineSeries.Create(Self); // baseline data
Chart1.AddSeries(S3);
for i := 0 to 10 do
S1.AddXY(i, YVAL[i]);
YLimit := S1.MaxYValue * 0.75;
DrawLimitAreaChart(S1, S2, S3, YLimit, ChartTool1, ChartTool2, 2, clBlack,
TColor($0024FF){clOrangeRed}, TColor($FF4D4D){clNeonBlue});

end;

那么代码的作用是:

将 X,Y 数据填充到系列[0]中。调用 DrawLimitAreaChart 过程,其中根据系列[0] 计算新系列,使得没有任何部分高于 Ylimit。最后,将第三个系列用作第二个系列的基线。现在,这三条曲线与两条 TSeriesBandTools 一起形成了一个双色区域面积图。

更新3

根据要求,这里是一个图表示例,其中 X 轴为时间。执行此操作的代码在我下面的评论中。

enter image description here

关于delphi - 创建面积图,用其他颜色为溢出值的部分着色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10149340/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com