Microsoft Chart堆积柱形图有间隙

2023-11-23

我正在使用 .Net 4.0 中的图表库来创建包含多个系列的堆叠柱形图。我的目标是一个直方图,显示多个系列(教师)每天的累积操作数(报告完成情况)。经常会丢失数据(特定教师当天没有活动)。

当系列中缺少数据时,我会在条形图中出现间隙:

Histogram with gaps in the columns

My code:

    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(新系列()); Chart1.Series.Add(新系列()); Chart1.Series.Add(新系列()); Chart1.Series.Add(新系列());

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

Image of "before.png": enter image description here

现在删除给定 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, 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));

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

Image of "after.png": enter image description here

因此,鉴于您无法在事后添加零点(尽管您可能能够插入它们?),您将需要将代码修改为如下所示:

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)的陷阱,因为这是行不通的。

如果您需要更多帮助,请告诉我。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Microsoft Chart堆积柱形图有间隙 的相关文章

随机推荐

  • Angular HTTP 拦截器 - 在多模块应用程序中显示微调器

    我正在尝试显示ng4 loading spinner用于对我的 API 进行 HTTP 调用的微调器 我的代码基于以下链接中的示例 https angular io guide http intercepting all requests
  • 从进程中删除管理员权限

    在这位伟大人物的帮助下MSDN 文章 我的第一个想法是简单地检查进程是否正在使用提升的管理员组 然后使用AdjustTokenGroups 我将管理员组设置为SE GROUP USE FOR DENY ONLY 但不幸的是 我们无法修改当前
  • iOS 9 通用链接无法从同一域启动应用程序

    我已设置 AASA JSON 文件以在有人访问时打开应用程序myDomain com ShowInTheApp 这适用于 Notes 应用程序 电子邮件 Gmail 应用程序 Safari 上的 Gmail 网络以及基本上除 myDomai
  • Excel ODBC 和 64 位服务器

    使用 ASP NET 我需要更新 Excel 模板 我们的服务器正在 64 位模式下运行 Windows 2008 我使用以下代码来访问 Excel 文件 string connection Provider MSDASQL Driver
  • 如何将 Row 类型转换为 Vector 以馈送到 KMeans

    当我尝试将 df2 提供给 kmeans 时 出现以下错误 clusters KMeans train df2 10 maxIterations 30 runs 10 initializationMode random 我得到的错误 Can
  • 错误:无法从静态上下文引用非静态方法“findViewById(int)”

    我正在使用 Android Studio Beta 在 onCreateView 中使用此 java 代码时 出现错误 ListView listView ListView findViewById R id someListView 这是
  • FFMPEG 在命令行中运行,但不在 PHP 中运行

    我正在使用 ffmpeg build for windows 来制作视频缩略图 该命令在命令行中运行良好 但在 PHP exec 方法中运行不佳 我使用 PHP 5 2 11 这是命令 E Documents and Settings x
  • 使用 Rhino-Mock 存根排序方法返回值

    我在阅读 Roy Osherove 的同时开始尝试 Rhino Mocks 3 6 单元测试的艺术 他有一个示例 演示了可以编写模拟方法的脚本 以便在使用相同参数调用两次时返回不同的结果 Test public void ReturnRes
  • 多次调用 thread.timer()

    代码 from threading import Timer import time def hello print hello a Timer 3 hello a start time sleep 4 a start 运行此脚本后 我收到
  • 错误:原因:无法找到请求目标的有效证书路径

    当我同步 gradle 时 我在 android Studio 2 2 3 中收到以下错误 错误 原因 无法找到请求目标的有效证书路径 我该如何解决这个问题 我也在添加我的 Gradle 文件 apply plugin com androi
  • 在临时字符串上使用 string::c_str [重复]

    这个问题在这里已经有答案了 关于临时对象何时被销毁 这是否有效 FILE f fopen std string my path c str r 在评估第一个参数后 临时对象是否会立即被销毁fopen或之后fopen call 使用以下代码进
  • 方便地移动列

    关于如何将列移动到第一个或最后一个位置有很多很好的问题和答案 Using dplyr最佳答案分别类似于 iris2 lt iris gt head 2 iris2 gt select Sepal Width everything move
  • 在命名元组列表中建立索引并查找值

    我有一个如下所示的命名元组 tup myTuple a b c 其中 可以是任何值 字符串 数字 日期 时间等 现在 我列出了这些命名元组并想要找到 假设 c 1 以及 a 和 b 的相应值 有没有Pythonic的方法可以做到这一点 使用
  • 字体大小独立的 UI:当我切换到 120 DPI 时一切都崩溃了?

    因此 我正在阅读有人在另一个问题中链接到的 Windows Vista UI 指南 他们提到您应该能够在切换到 120 DPI 后继续生存 好吧 我启动了安装了应用程序的便捷虚拟机 然后我们得到了什么 啊啊啊 大规模用户界面失败 一切都杂乱
  • 将一个输入文件与给定数量的文件进行匹配的算法

    我上周去面试了 我被算法回合中的一个问题困住了 我回答了这个问题 但面试官似乎并不相信 这就是为什么我分享同样的内容 请告诉我这个问题有什么优化的方法 以便对我以后的面试有帮助 Question 给出了 20 个文本文件 所有文件都是 AS
  • 为什么局部变量的地址每次都会不同?

    我询问了 Google 并在 StackOverflow 上做了一些研究 我的问题是 当我进入main 在C 程序中调用函数并声明第一个变量 为什么该变量的地址在不同的执行过程中会有所不同 请参阅下面我的示例程序 include
  • Android - 显示动画状态栏图标

    我正在尝试将通知状态栏图标设置为动画 android R drawable stat sys upload 它工作正常 但图标没有动画 private void showStatusNotification NotificationMana
  • 使用 IF/ELSE IF 语句的奇怪错误

    我试图创建一个依赖于场景参数值的临时表并使用以下 IF 语句 但出现以下错误 IF indexName A begin select top 400 into temp from pretemp order by EMRev desc en
  • Android.mk 中的每个文件 CPPFLAGS

    我正在处理一个 Android mk 文件 其中对于单个模块 其中一个文件需要不同的 CPPFLAGS 也就是说 它需要启用 frtti 而其他则需要 Android 默认的 fno rtti 显而易见的解决方案是目标特定变量 但奇怪的是
  • Microsoft Chart堆积柱形图有间隙

    我正在使用 Net 4 0 中的图表库来创建包含多个系列的堆叠柱形图 我的目标是一个直方图 显示多个系列 教师 每天的累积操作数 报告完成情况 经常会丢失数据 特定教师当天没有活动 当系列中缺少数据时 我会在条形图中出现间隙 My code