如何消除堆积条中的间隙

How to remove gaps in stacked bar

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

我试图像在堆栈上的某些 post 中建议的那样添加零数据点,但它对我的情况没有帮助。 (Microsoft chart stacked column chart has gaps)

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

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

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

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

您需要用 0 值填充所有缺失的点。我在列表 points 中使用了 class daz 而不是您的 items,但你会得到 'point'..:[=​​18=]

    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 在这里是 垂直的