在图表控件中将范围列数据与x轴标签对齐

时间:2015-08-11 09:50:39

标签: c# charts alignment series

我正在尝试使用C#.NET中的Chart控件来执行一组代理程序任务的范围列图。我在x轴上绘制代理编号,沿y轴绘制任务时间。我唯一的问题是列数据不能与x轴上的代理编号正确对齐。有谁知道如何将列与相应的x轴标签对齐?

以下是我的图表的图片:

enter image description here

这是我的代码:

    chartSchedule.Titles.Add("Agent / Task Schedule");
    chartSchedule.ChartAreas[0].AxisX.Title = "Agent";
    chartSchedule.ChartAreas[0].AxisY.Title = "Time";

    int index = 0;
    foreach ( Agent a in _agents )
    {
        // Create a series for each agent and set up display details
        Series agentSeries = chartSchedule.Series.Add("Agent " + a.Id);
        agentSeries.ChartType = SeriesChartType.RangeColumn;

        // Alternate colours of series lines
        if ( index % 2 > 0 )
          agentSeries.Color = Color.DodgerBlue;
        else
          agentSeries.Color = Color.Blue;

        // Display start and end columns of every task
        List<DataPoint> timeData = new List<DataPoint>();
        foreach ( NodeTask t in a.AssignedTasks )
        {
            agentSeries.Points.AddXY(index + 1, t.StartTime, t.EndTime);
        }

        index++;
    }

1 个答案:

答案 0 :(得分:0)

看似“错位”的原因在于您总共添加了五个系列,但每个X值只有一个(一组)Datapoint(s)。

然后将这个现有的DataPoint与四个不存在的DataPoints组合在一起,其中五个并排显示为一个以X值/标签为中心的块。这看起来很合适对于中间系列,实际上有中间点。

您可以添加一些其他点来查看效果..:

    agentSeries.Points.AddXY(1, 1, 4);
    agentSeries.Points.AddXY(2, 1, 2);
    agentSeries.Points.AddXY(4, 1, 3);

enter image description here

所以最自然的解决方案是不添加缺少数据的系列。

不确定您是否对此解决方案感到满意,或者是否有更好的方法,但结果看起来并不那么糟糕。

enter image description here

我已经废除了添加所有这些系列,而是将所有数据添加到同一个系列

要创建图例,我可以通过将其颜色设置为透明来隐藏常规图例。 (它需要在那里。)然后我添加新的传奇CustomItems,并像你一样给它们颜色和名称。

这是我使用的代码,除了我模拟的实际数据:

    chartSchedule.Series.Clear();
    ChartArea CA = chartSchedule.ChartAreas[0];

    chartSchedule.Titles.Add("Agent / Task Schedule");
    chartSchedule.ChartAreas[0].AxisX.Title = "Agent";
    chartSchedule.ChartAreas[0].AxisY.Title = "Time";

    // our only Series
    Series agentSeries = chartSchedule.Series.Add(" " );
    agentSeries.ChartType = SeriesChartType.RangeColumn;
    agentSeries.Color = Color.Transparent;  // hide the default series entry!

    agentSeries["PixelPointWidth"] = "20"; // <- your choice of width!

    int index = 0;
    foreach (Agent a in _agents)
    {
        // Alternate colours 
        Color color = index % 2 == 0 ? Color.DodgerBlue : Color.Blue;

        // Display start and end columns of every task
        List<DataPoint> timeData = new List<DataPoint>();  ///???
        foreach (NodeTask t in a.AssignedTasks)
        {
            int p = agentSeries.Points.AddXY(index +1, t.StartTime, t.EndTime);
            agentSeries.Points[p].Color = color;
        }

        chartSchedule.Legends[0].CustomItems.Add(color, "Agent " + index);
        index++;
    }