How to add spikes to line on Winform chart?

泪湿孤枕 提交于 2019-12-11 08:32:58

问题


I am drawing a line on a graph from numbers read from a text file. There is a number on each line of the file which corresponds to the X co-ordinate while the Y co-ordinate is the line it is on.

The requirements have now changed to include "special events" where if the number on the line is followed by the word special a spike will appear like image below:

Currently the only way I can find is to use a line for each spike, however there could be a large of these special events and so needs to be modular. This seems an efficient and bad way to program it.

Is it possible to add the spikes to the same graph line? Or is it possible to use just one additional line and have it broken (invisible) and only show where the spikes are meant to be seen?

I have looked at using bar graphs but due to other items on the graph I cannot.


回答1:


The DataPoints of a Line Chart are connected so it is not possble to really break it apart. However each segment leading to a DataPoint can have its own color and that includes Color.Transparent which lends itself to a simple trick..

Without adding extra Series or Annotations, your two questions can be solved like this:

  • To simply add the 'spikes' you show us in the 2nd graph, all you need to do is to insert 2 suitable datapoints, the 2nd being identical to the point the spike is connected to.

  • To add an unconnected line you need to 'jump' to its beginning by adding one extra point with a transparent color.

Here are two example methods:

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);
}

You can call them like this:

addSpike(chart1.Series[0], 3, 50d);
addLine(chart1.Series[0], 6, 30d,  80d);

Note that they add 2 or 3 DataPoints to the Points collection!

Of course you can set the Color and width (aka BorderWidth) of the extra lines as you wish and also include them in the params list..

If you want to keep the points collection unchanged you also can simply create one 'spikes series' and add the spike points there. The trick is to 'jump' to the new points with a transparent line!



来源:https://stackoverflow.com/questions/29908979/how-to-add-spikes-to-line-on-winform-chart

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!