在图表中绘制年份的季度指标

时间:2018-02-06 00:44:07

标签: c# plot charts

我出来了一个Windows表单应用程序,用于绘制折线图。我的X轴值是DateTime类型,而Y轴是Decimal类型。除了我当前的图表,我想在我的图表中包含一些垂直线来表示一段时间(一年中的季度)。

  

绘制图表的功能:

private void PlotChart(string[] sortedRow)
{
    count = sortedRow(8);
    dateHolder.Add(count);
    spcPoint = Math.Round(sortedRow(7) * multiplier, decimalPoint);
    try
    {
        this.Chart1.Series("Result").Points.AddXY(count, spcPoint);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ErrorToString);
    }
}

我正在逐行将CSV文件传递给上述函数,并根据每行中可用的值绘制图表。我已经在DateTime的DateTime列表中累积了所有可用的DateTime值。请注意,dateHolder的值按照从最旧到最新的日期增加的方式排列。假设我有从2015年12月4日到2017年11月30日的时间段的数据我的目标如下: enter image description here

从上图中,有一些绿线。绿线代表我的季度期间:

1st line : 31st Dec 2015 (Q4 end 2015)
2nd line : 1st Jan 2016 (Q1 begin 2016)
3rd line : 31st Mar 2016 (Q1 end 2016)
4th line : 1st Apr 2016 (Q2 begin 2016)
5th line : 30th Jun 2016 (Q2 end 2016)

and so on...
  

绘制季度指标的功能:

 private void PlotPeriodicIndicator()
    {
        int lastPoint = dateHolder.Count();
        DateTime startDate = dateHolder(0);
        DateTime endDate = dateHolder(lastPoint - 1);
        //No idea how to continue here
    }

1 个答案:

答案 0 :(得分:0)

这是一种在PostPaint事件中绘制线条的方法;它假设你有一个填充List<DateTime> markers

private void chart1_PostPaint(object sender, ChartPaintEventArgs e)
{
    Axis ax = chart1.ChartAreas[0].AxisX;
    Axis ay = chart1.ChartAreas[0].AxisY;

    foreach (DateTime d in markers)
    {
        int x = (int)ax.ValueToPixelPosition(d.ToOADate());

        int y0 = (int)ay.ValueToPixelPosition(ay.Minimum);
        int y1 = (int)ay.ValueToPixelPosition(ay.Maximum);

        e.ChartGraphics.Graphics.DrawLine(Pens.Red, x, y0, x, y1);
    }
}

请注意,这应该位于其中一个Paint事件中,因为轴函数并不总是有效,否则绘图不是永久性的。

使用Annotations

的效果相同
chart1.ChartAreas[0].RecalculateAxesScale();
foreach (DateTime d in markers)
{
    VerticalLineAnnotation va = new VerticalLineAnnotation();
    va.AxisX = chart1.ChartAreas[0].AxisX;
    va.AxisY = chart1.ChartAreas[0].AxisY;
    va.X = d.ToOADate();
    va.ClipToChartArea = chart1.ChartAreas[0].Name;
    va.IsInfinitive = true;
    va.LineColor = Color.Red;
    va.Width = 1;
    chart1.Annotations.Add(va);
}

请注意,在使用新设定点时,我们需要首先强制执行轴计算;另外我们需要分配注释轴来强制使用值坐标而不是默认百分比。