如何清除堆叠条中的间隙 [英] How to remove gaps in stacked bar

查看:275
本文介绍了如何清除堆叠条中的间隙的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在C#中绘制甘特图,我使用StackedBar图表类型。此图表的目标是显示任务如何在机器数量上计划。在我的算法中,图表上的任务之间不应有空闲空间。每个任务作为新系列添加。在第一栏,它的工作方式应该是,但在其他人的任务结束后,在上一个酒吧开始。我需要帮助删除这些差距。有些任务需要在两台机器上分开,当我这样做时,这个任务就显示在第二列,就像它应该从bar开始。



I试图添加零数据点像一些建议在栈上的帖子,但它没有帮助在我的情况。 (

解决方案

堆叠条形图会将所有系列堆叠在一起,并且这样做它预期所有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填补空缺。



(*)注意 code>和 y 在条形图中可视切换,因此 x轴垂直在这里!


I'm trying to make gantt chart in C#, I'm using StackedBar chart type. The goal of this chart is to show, how "tasks" can be schedule on number of "machines". In my algorithm there shouldn't be free spaces between "tasks" on chart. Each "task" is added as new series. On first bar it's working like it should be, but in others "task" starts after ending on the previous bar. I need help with removing these gaps. Some task need to be divided on two machines, and when I do it, then this task is showing on second column like it should, from the begining of bar.

I was trying to add zero DataPoints like suggested in some post on stack, but it didn't help in my case. (Microsoft chart stacked column chart has gaps)

Below is my code to create this chart:

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;    
      }
 }

-- edit --

As requested chart with data: http://i.imgur.com/64X3SNy.png

解决方案

A stacked bar chart will stack all series right upon each other and to do so it expects data points for all x-values (*) of each series. So the gaps in your chart come from gaps in the data points.

To get the result you probably want:

you need to fill in all the missing points with values of 0. I have used a class daz in a list points instead of your items, but you will get the 'point'..:

    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));

Depending on your data structure and source you should either do it when collecting the data or start out with a zero-pre-filled data structure or maybe use a little linq to fill in the gaps later..

(*) Note that x and y are switched visually in bar charts, so the x-axis is vertical here!

这篇关于如何清除堆叠条中的间隙的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆