【问题标题】:How to add spikes to line on Winform chart?如何在 Winform 图表上添加尖峰?
【发布时间】:2015-04-28 01:56:46
【问题描述】:

我正在根据从文本文件中读取的数字在图表上画一条线。文件的每一行都有一个数字,对应于 X 坐标,而 Y 坐标是它所在的行。

现在要求已更改为包括“特殊事件”,如果行中的数字后面跟着单词 special,则会出现如下图所示的尖峰:

目前我能找到的唯一方法是为每个尖峰使用一条线,但是这些特殊事件可能很多,因此需要模块化。这似乎是一种有效且糟糕的编程方式。

是否可以将尖峰添加到同一条曲线?或者是否可以只使用一条额外的线并将其断开(不可见)并且只显示应该看到尖峰的位置?

我看过使用条形图,但由于图表上的其他项目我不能。

【问题讨论】:

  • 你不能在同一张图表上使用第二个系列吗?添加第二个系列时有什么问题?
  • 嗨,罗恩,请参阅“是否可以仅使用额外的一行并使其损坏(不可见)并仅显示应该看到尖峰的位置?”的问题。你是说一个系列可以有多个单独的行吗?

标签: c# winforms charts linegraph


【解决方案1】:

LineChartDataPoints连接的,因此不可能真正将其分开。然而,通往DataPoint 的每个段都可以有自己的颜色,其中包括Color.Transparent,这很适合一个简单的技巧..

不用额外添加SeriesAnnotations,你的两个问题可以这样解决:

  • 要简单地添加您在第二张图中显示的“尖峰”,您需要做的就是插入 2 个合适的数据点,第二个与尖峰连接的点相同。

  • 要添加一条未连接的线,您需要通过添加一个透明颜色的额外点来“跳转”到它的开头。

这里有两个示例方法:

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 个 DataPoints 添加到 Points 集合中!

当然,您可以根据需要设置额外线条的颜色和宽度(又名 BorderWidth),并将它们包含在参数列表中..

如果您想保持积分集合不变,您也可以简单地创建一个“尖峰系列”并在那里添加尖峰点。诀窍是用透明线“跳”到新点!

【讨论】:

    猜你喜欢
    • 2012-04-06
    • 1970-01-01
    • 2021-10-16
    • 2010-09-19
    • 2021-01-07
    • 1970-01-01
    • 1970-01-01
    • 2017-10-14
    • 2018-09-05
    相关资源
    最近更新 更多