如何在 Winform 图表上添加尖峰?
How to add spikes to line on Winform chart?
我正在根据从文本文件中读取的数字在图表上画一条线。文件的每一行都有一个数字,对应于 X co-ordinate 而 Y co-ordinate 是它所在的行。
要求现已更改为包括 "special events",如果行中的数字后跟“特殊”一词,则会出现尖峰,如下图所示:
目前我能找到的唯一方法是为每个峰值使用一条线,但是可能会有大量这样的特殊事件,因此需要模块化。这似乎是一种高效但糟糕的编程方式。
是否可以将尖峰添加到同一条图表线?或者是否可以只使用一根额外的线并将其断开(不可见)并且只显示应该看到尖峰的位置?
我考虑过使用条形图,但由于图表上的其他项目我不能。
Line
Chart
的 DataPoints
是 相连的 因此不可能真正将其分开。然而,通往 DataPoint
的每个段都可以有自己的颜色,其中包括 Color.Transparent
这有助于一个简单的技巧..
不添加额外的Series
或Annotations
,你的两个问题可以这样解决:
要简单地添加您在第二张图中向我们展示的 'spikes',您需要做的就是插入 2 个合适的数据点,第二个与尖峰连接的点相同到。
要添加一条未连接的线,您需要 'jump' 添加一个透明颜色的额外点。
这里有两个示例方法:
void addSpike(Series s, int index, double spikeWidth)
{
DataPoint dp = s.Points[index];
DataPoint dp1 = new DataPoint(dp.XValue + spikeWidth, dp.YValues[0]);
s.Points.Insert(index+1, dp1);
s.Points.Insert(index+2, dp);
}
void addLine(Series s, int index, double spikeDist, double spikeWidth)
{
DataPoint dp = s.Points[index];
DataPoint dp1 = new DataPoint(dp.XValue + spikeDist, dp.YValues[0]);
DataPoint dp2 = new DataPoint(dp.XValue + spikeWidth, dp.YValues[0]);
DataPoint dp0 = dp.Clone();
dp1.Color = Color.Transparent;
dp2.Color = dp.Color;
dp2.BorderWidth = 2; // optional
dp0.Color = Color.Transparent;
s.Points.Insert(index + 1, dp1);
s.Points.Insert(index + 2, dp2);
s.Points.Insert(index + 3, dp0);
}
你可以这样称呼他们:
addSpike(chart1.Series[0], 3, 50d);
addLine(chart1.Series[0], 6, 30d, 80d);
请注意,他们向点集合添加了 2 或 3 个数据点!
当然,您可以根据需要设置额外线条的颜色和宽度(又名 BorderWidth),并将它们包含在参数列表中..
如果您想保持积分集合不变,您也可以简单地创建一个 'spikes series' 并在其中添加尖峰积分。诀窍是'jump'到新点用透明线!
我正在根据从文本文件中读取的数字在图表上画一条线。文件的每一行都有一个数字,对应于 X co-ordinate 而 Y co-ordinate 是它所在的行。
要求现已更改为包括 "special events",如果行中的数字后跟“特殊”一词,则会出现尖峰,如下图所示:
目前我能找到的唯一方法是为每个峰值使用一条线,但是可能会有大量这样的特殊事件,因此需要模块化。这似乎是一种高效但糟糕的编程方式。
是否可以将尖峰添加到同一条图表线?或者是否可以只使用一根额外的线并将其断开(不可见)并且只显示应该看到尖峰的位置?
我考虑过使用条形图,但由于图表上的其他项目我不能。
Line
Chart
的 DataPoints
是 相连的 因此不可能真正将其分开。然而,通往 DataPoint
的每个段都可以有自己的颜色,其中包括 Color.Transparent
这有助于一个简单的技巧..
不添加额外的Series
或Annotations
,你的两个问题可以这样解决:
要简单地添加您在第二张图中向我们展示的 'spikes',您需要做的就是插入 2 个合适的数据点,第二个与尖峰连接的点相同到。
要添加一条未连接的线,您需要 'jump' 添加一个透明颜色的额外点。
这里有两个示例方法:
void addSpike(Series s, int index, double spikeWidth)
{
DataPoint dp = s.Points[index];
DataPoint dp1 = new DataPoint(dp.XValue + spikeWidth, dp.YValues[0]);
s.Points.Insert(index+1, dp1);
s.Points.Insert(index+2, dp);
}
void addLine(Series s, int index, double spikeDist, double spikeWidth)
{
DataPoint dp = s.Points[index];
DataPoint dp1 = new DataPoint(dp.XValue + spikeDist, dp.YValues[0]);
DataPoint dp2 = new DataPoint(dp.XValue + spikeWidth, dp.YValues[0]);
DataPoint dp0 = dp.Clone();
dp1.Color = Color.Transparent;
dp2.Color = dp.Color;
dp2.BorderWidth = 2; // optional
dp0.Color = Color.Transparent;
s.Points.Insert(index + 1, dp1);
s.Points.Insert(index + 2, dp2);
s.Points.Insert(index + 3, dp0);
}
你可以这样称呼他们:
addSpike(chart1.Series[0], 3, 50d);
addLine(chart1.Series[0], 6, 30d, 80d);
请注意,他们向点集合添加了 2 或 3 个数据点!
当然,您可以根据需要设置额外线条的颜色和宽度(又名 BorderWidth),并将它们包含在参数列表中..
如果您想保持积分集合不变,您也可以简单地创建一个 'spikes series' 并在其中添加尖峰积分。诀窍是'jump'到新点用透明线!