2015-08-11 2 views
1

Я пытаюсь выполнить график столбцов диапазона набора задач агентов с помощью элемента управления Chart в C# .NET. Я обрабатываю номер агента по оси x и время задачи вдоль оси y. Моя единственная проблема заключается в том, что данные столбца не будут правильно выравниваться с номерами агентов на оси x. Кто-нибудь знает, как выровнять столбцы с соответствующими метками оси 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++; 
    } 
+0

Спасибо. Я отредактировал сообщение, чтобы добавить ссылку на мой график – humbleHacker

+0

Это замечательно! Я попробовал, и он делает именно то, что я хочу. Мне просто нужно было изменить строку Legends [0] .CustomItems, которая является свойством chartSchedule not agentSeries. Большое спасибо за Вашу помощь. – humbleHacker

ответ

0

Причина кажущейся «перекос» в том, что вы добавляете в общей сложности пять но каждый имеет только один (набор) Datapoint (s) для X-Value.

Этот существующий DataPoint затем объединяется с четырьмя несуществующими точками данных, и пять из них отображаются бок о бок как один блок, центрированный на 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

Я покончила с добавлением всех тех, серии и вместо этого добавить все данные в одну и ту же Серия.

Чтобы создать Легенды, я скрываю обычный, задавая свой цвет прозрачным. (Он должен быть там.) Затем я добавляю новый Legend 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++; 
    } 
Смежные вопросы