2

我正在尝试用 C# 制作甘特图,我使用的是 StackedBar 图表类型。此图表的目的是显示如何根据“机器”的数量安排“任务”。在我的算法中,图表上的“任务”之间不应该有空闲空间。每个“任务”都作为新系列添加。在第一个栏上,它按应有的方式工作,但在其他栏上,“任务”在前一个栏结束后开始。我需要帮助来消除这些差距。有些任务需要在两台机器上划分,当我这样做时,这个任务就会像它应该的那样显示在第二列,从栏的开头开始。

我试图添加零数据点,就像在堆栈上的一些帖子中建议的那样,但它对我的情况没有帮助。(微软图表堆积柱形图有差距

以下是我创建此图表的代码:

foreach (var item in tasks)
{
     scheduleChart.Series.Add(item.Name);
     scheduleChart.Series[item.Name].ChartType = SeriesChartType.StackedBar;
     scheduleChart.Series[item.Name].LabelForeColor = Color.White;
}

for (int i = 0; i < mcNaugthon.Machines.Count; i++)
{
     foreach (var item in mcNaugthon.Machines[i].Tasks)
     {
          scheduleChart.Series[item.Name].Points
              .Add(new DataPoint(i, item.Time));
          scheduleChart.Series[item.Name].Label = item.Name;    
      }
 }

在此处输入图像描述

- 编辑 -

根据要求提供数据图表:http: //i.imgur.com/64X3SNy.png

4

1 回答 1

1

堆叠条形图将所有系列彼此堆叠,为此它需要每个系列的所有 x 值 (*)的数据点。因此,图表中的差距来自数据点的差距。

要获得您可能想要的结果:

在此处输入图像描述

你需要用 0 值填充所有缺失的点。我daz在列表中使用了一个类points而不是你的items,但你会得到“点”..:

    points.Add(new daz("0", 0, 3));
    points.Add(new daz("0", 1, 0));  //<-filler
    points.Add(new daz("0", 2, 0));  //<-filler
    points.Add(new daz("1", 0, 7));
    points.Add(new daz("1", 1, 0));  //<-filler
    points.Add(new daz("1", 2, 0));  //<-filler
    points.Add(new daz("2", 0, 1));
    points.Add(new daz("2", 1, 0));  //<-filler
    points.Add(new daz("2", 2, 0));  //<-filler
    points.Add(new daz("3", 0, 1));
    points.Add(new daz("3", 1, 7));
    points.Add(new daz("3", 2, 0));  //<-filler
    points.Add(new daz("4", 0, 0));  //<-filler
    points.Add(new daz("4", 1, 3));
    points.Add(new daz("4", 2, 0));  //<-filler
    points.Add(new daz("5", 0, 0));  //<-filler
    points.Add(new daz("5", 1, 1));
    points.Add(new daz("5", 2, 0));  //<-filler
    points.Add(new daz("6", 0, 0));  //<-filler
    points.Add(new daz("6", 1, 1));
    points.Add(new daz("6", 2, 2));
    points.Add(new daz("7", 0, 0));  //<-filler
    points.Add(new daz("7", 1, 1));
    points.Add(new daz("7", 2, 3));
    points.Add(new daz("8", 0, 0));  //<-filler
    points.Add(new daz("8", 1, 0));  //<-filler
    points.Add(new daz("8", 2, 2));
    points.Add(new daz("9", 0, 0));  //<-filler
    points.Add(new daz("9", 1, 0));  //<-filler
    points.Add(new daz("9", 2, 3));

根据您的数据结构和来源,您应该在收集数据时执行此操作,或者从零预填充数据结构开始,或者稍后使用一点 linq 来填补空白。

(*) 注意xy在条形图中是可视切换的,所以这里x-axis垂直的!

于 2015-04-26T22:39:13.900 回答