我出来了一个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日的时间段的数据我的目标如下:
从上图中,有一些绿线。绿线代表我的季度期间:
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
}
答案 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);
}
请注意,在使用新设定点时,我们需要首先强制执行轴计算;另外我们需要分配注释轴来强制使用值坐标而不是默认百分比。