我正在尝试使用C#.NET中的Chart控件来执行一组代理程序任务的范围列图。我在x轴上绘制代理编号,沿y轴绘制任务时间。我唯一的问题是列数据不能与x轴上的代理编号正确对齐。有谁知道如何将列与相应的x轴标签对齐?
以下是我的图表的图片:
这是我的代码:
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 :(得分: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);
所以最自然的解决方案是不添加缺少数据的系列。
不确定您是否对此解决方案感到满意,或者是否有更好的方法,但结果看起来并不那么糟糕。
我已经废除了添加所有这些系列,而是将所有数据添加到同一个系列。
要创建图例,我可以通过将其颜色设置为透明来隐藏常规图例。 (它需要在那里。)然后我添加新的传奇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++;
}