Microsoft图表堆积的柱形图存在间隙

问题描述

| 我正在使用.Net 4.0中的图表库来创建具有多个系列的堆叠式柱形图。我的目标是建立一个直方图,以显示多个系列(教师)每天的动作(报告完成)总数。经常缺少数据(特定老师当天没有活动)。 当系列中缺少数据时,我会在栏上留下空白: 我的代码
    public ActionResult CompletionHistogram(int sid,int width,int height)
    {
        Site site = SiteRepository.Get(sid);
        if (site == null)
            return new HttpNotFoundResult();

        Chart chart = new Chart();
        chart.Height = height;
        chart.Width = width;
        ChartArea area = chart.ChartAreas.Add(\"Default\");

        // Treat each teacher as a series
        foreach (Teacher t in site.Teachers)
        {
            Series series = chart.Series.Add(t.FullName);
            series.ChartType = SeriesChartType.StackedColumn;
            series.Name = t.FullName;

            // Group completions by day (filter out incomplete reports and null timestamps)
            var groups = t.StudentReports
                .Where<StudentReport>(rep => rep.IsComplete && rep.FirstSaveTimestamp.HasValue)
                .GroupBy<StudentReport,DateTime>(rep => rep.FirstSaveTimestamp.Value.Date);

            bool hasPoints = false;
            foreach (var g in groups)
            {
                series.Points.AddXY(g.Key,g.Count());
                hasPoints = true;
            }

            series.IsValueShownAsLabel = true;
            series.ToolTip = \"#VALX\";

            if (hasPoints)
                chart.DataManipulator.InsertEmptyPoints(1,IntervalType.Days,series);
        }


        area.AxisX.LabelStyle.Format = \"ddd M/d\";
        return new ChartResult(chart);
    }
我该如何删除     

解决方法

我有办法使这项工作。 很抱歉,答案很长,但是我发现您尝试实现此答案的方式会影响它是否起作用。 添加点时,需要手动将点设置为零。 注意:我无法通过在事实之后添加零点来完成这项工作。 请参阅示例和结果截图旁边的内容:     chart1.Series.Clear();     chart1.Series.Add(new Series());     chart1.Series.Add(new Series());     chart1.Series.Add(new Series());     chart1.Series.Add(new Series());
foreach (Series s in chart1.Series)
{
    s.ChartType = SeriesChartType.StackedColumn;
}

//chart1.Series[0].Points.Add(new DataPoint(0,0));
chart1.Series[0].Points.Add(new DataPoint(1,3));
chart1.Series[0].Points.Add(new DataPoint(2,3));
chart1.Series[0].Points.Add(new DataPoint(3,3));

chart1.Series[1].Points.Add(new DataPoint(0,3));
//chart1.Series[1].Points.Add(new DataPoint(1,0));
chart1.Series[1].Points.Add(new DataPoint(2,3));
chart1.Series[1].Points.Add(new DataPoint(3,3));

chart1.Series[2].Points.Add(new DataPoint(0,3));
chart1.Series[2].Points.Add(new DataPoint(1,3));
//chart1.Series[2].Points.Add(new DataPoint(2,0));
chart1.Series[2].Points.Add(new DataPoint(3,3));

chart1.Series[3].Points.Add(new DataPoint(0,3));
chart1.Series[3].Points.Add(new DataPoint(1,3));
chart1.Series[3].Points.Add(new DataPoint(2,3));
//chart1.Series[3].Points.Add(new DataPoint(3,0));

chart1.SaveImage(\"C:\\\\Before.png\",ChartImageFormat.Png);
\“ before.png \”的图片: 现在,删除没有给定x值的数据点的系列注释: (注意!我发现如果将给定x值的点添加到最后使y = 0的值(也就是在保存图像之前),这是行不通的。系列中点的顺序似乎很重要对于StackedColumn,除了研究如何回答此问题(对于此类用户可能是常识)之外,我从未使用过这种类型。
chart1.Series.Clear();
chart1.Series.Add(new Series());
chart1.Series.Add(new Series());
chart1.Series.Add(new Series());
chart1.Series.Add(new Series());

foreach (Series s in chart1.Series)
{
    s.ChartType = SeriesChartType.StackedColumn;
}

chart1.Series[0].Points.Add(new DataPoint(0,3));
chart1.Series[1].Points.Add(new DataPoint(1,3));
chart1.Series[2].Points.Add(new DataPoint(2,3));
chart1.Series[3].Points.Add(new DataPoint(3,0));

// If you add the empty points here,it does not seem to work.  
// Empty points are as follows,and are already added above in the \'after\' example.
// chart1.Series[0].Points.Add(new DataPoint(0,0));
// chart1.Series[1].Points.Add(new DataPoint(1,0));
// chart1.Series[2].Points.Add(new DataPoint(2,0));
// chart1.Series[3].Points.Add(new DataPoint(3,0));

chart1.SaveImage(\"C:\\\\After.png\",ChartImageFormat.Png);
\“ after.png \”的图片: 因此,假设您不能在事实之后添加零点(尽管您可以插入零点?),则需要将代码修改为如下所示:
var allPossibleGroups = t.StudentReports;

var groups = t.StudentReports
            .Where<StudentReport>(rep => rep.IsComplete && rep.FirstSaveTimestamp.HasValue)
            .GroupBy<StudentReport,DateTime>(rep => rep.FirstSaveTimestamp.Value.Date);

        bool hasPoints = false;
        foreach (var g in allPossibleGroups)
        {
            if(groups.ContainsKey(g))
            {
                series.Points.AddXY(g.Key,g.Count());
                hasPoints = true;
            }
            else
            {
                series.Points.AddXY(g.Key,0);
            }
        }
很抱歉,很长的代码块,但是该示例是必要的,以演示如何使其工作,而不会陷入最后添加空点(其中y = 0)的陷阱,因为这将无法工作。 让我知道您是否需要更多帮助。     ,我自己遇到了同样的问题,想分享正确的解决方案: 使用DataManipulator插入缺少的(x,y)值:
foreach (Series s in chart.Series)
{
    chart.DataManipulator.Sort(PointSortOrder.Ascending,\"X\",s);
    chart.DataManipulator.InsertEmptyPoints(1,IntervalType.Number,s);
}
    ,出于某种原因,循环播放序列对我不起作用,但是下一个解决方案像一个咒语一样起作用:
Chart1.DataManipulator.InsertEmptyPoints(1,\"Series1,Series2,Series3,Series4\")
    

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...