【问题标题】:Datetime type X axis on MS Chart control without showing weekendsMS Chart 控件上的日期时间类型 X 轴不显示周末
【发布时间】:2016-07-29 09:54:32
【问题描述】:

我在 .Net 4 中使用 MS Chart 控件来显示 4 个数据系列,X 轴设置为日期时间类型。

将间隔设置为天,即使数据中不包含周末日期,图表也会包含周末。

除一个之外的所有系列都具有相同的日期点,例外是从最后一个日期开始并持续多个工作日(不包括周末)的投影线。

如何从所有系列的图表中删除周末(或没有价值的日期)的显示?

这是一个 winforms .Net 4.0 应用程序。

 foreach (var series in chart2.Series)
   {
       series.ChartType = SeriesChartType.Line;
       series.BorderWidth = 5;
       series.XValueType = ChartValueType.Date;
       // I Tried this to remove weekends but it results in the graph showing a big red X
       series.IsXValueIndexed = true; 
   }

使用代码编辑以在下面重现我的问题:

        DateTime dt = DateTime.Now;
        chart1.ChartAreas[0].AxisX.IntervalType = DateTimeIntervalType.Days;

        Series test1 = new Series("Test1");
        test1.XValueType = ChartValueType.Date;
        for (int i = 1; i < 7; i++)
        {
            //skip the weekend
            if (dt.DayOfWeek.ToString() == "Saturday") dt = dt.AddDays(1);
            if (dt.DayOfWeek.ToString() == "Sunday") dt = dt.AddDays(1);

            test1.Points.AddXY(dt.Date, i);
            dt = dt.AddDays(1);
            i++;
        }

        chart1.Series.Add(test1);

        Series test2 = new Series("Test2");
        test1.XValueType = ChartValueType.Date;
        for (int i = 1; i < 7; i++)
        {
            //skip the weekend
            if (dt.DayOfWeek.ToString() == "Saturday") dt = dt.AddDays(1);
            if (dt.DayOfWeek.ToString() == "Sunday") dt = dt.AddDays(1);

            test2.Points.AddXY(dt.Date, i);
            dt = dt.AddDays(1);
            i++;
        }

        chart1.Series.Add(test2);

        foreach (var series in chart1.Series)
        {
            series.ChartType = SeriesChartType.Line;
            series.BorderWidth = 5;
            series.IsXValueIndexed=true;
        }
        chart1.ChartAreas[0].AxisX.LabelStyle.Angle = 45;
        chart1.ChartAreas[0].AxisX.LabelStyle.Interval = 1;

【问题讨论】:

    标签: c# winforms charts


    【解决方案1】:

    您将 x 值添加为 DateTime,这是您应该做的。但默认情况下,这意味着所有 x 值都是按比例定位的,正如人们通常希望的那样。

    但您的情况是个例外,Series.IsXValueIndexed 属性的文档中甚至提到了这一点:

    一个系列中的所有数据点都使用顺序索引,如果这 属性为真,则数据点将按顺序绘制, 无论它们关联的 X 值如何。这意味着将有 没有“丢失”的数据点。

    例如,假设一个系列中有三 (3) 个数据点 X 值为 1、2 和 4。如果此属性为假,则会有 标记为“3”的 X 轴位置缺少数据点。但是,如果你 将此属性设置为 true,三个数据点将绘制在 1、2、4点,依次排列,不会有缺失数据 观点。标记为“3”的 X 轴位置不会出现在图表上。

    这很有用,当您不想丢失数据点时 您知道不会有数据的时间间隔,例如周末

    但请注意:

    如果您要显示多个系列并且至少有一个系列使用 索引 X 值,则所有系列必须对齐 - 也就是说,具有 相同数量的数据点——并且相应的点必须具有 相同的 X 值。

    所以你使用这个属性是正确的,但是很可能你的系列没有完全对齐

    为了确保它们经常是一个,可以使用Chart.DataManipulator.InsertEmptyPoints 重载之一。不幸的是,它们都使用固定的Interval,而不是使用模板Series

    因此,您需要确保在您的数据缺少 Series 中的值的地方添加一个 Empty DataPoint。如果数据是数据绑定的,则必须在 DataSource!

    中执行此操作

    【讨论】:

    • 嗨 Taw,感谢您的回复,我添加了上面的代码来显示我的问题!如果我注释掉所有 test2 的东西 test1 在这两个系列中都可以使用,我会得到红色的 X。从上面我是否需要为 test1 和 test2 中的所有日期添加一个空数据点到这两个系列?
    • 是的,如果你真的想要继续计数dt而不在两个系列之间重置它......!?
    • 是的,这只是一个真实的例子,我绘制了一个序列,然后添加一个将延长线的投影。我怎么说将所有空数据点添加到每个数据点,因为它们超出了 test2 的开头和 test1 的结尾?你能告诉我我会怎么做吗?
    • 这有点乏味,因为涉及循环所有系列两次和所有点以找到丢失的点.. 你想摆脱周末或工作日的间隙吗?碰巧没有任何系列的数据?在第一种情况下,为 ech workday 添加一个带有虚拟点的虚拟系列会使事情变得容易得多,因为您只会遍历该系列和其他系列的点..
    • 对不起,我想我对什么以及如何做到这一点感到困惑,对不起!在回答您的问题时,我只是想删除周末,所有其他日子都会有数据点在其范围内。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-19
    • 1970-01-01
    • 1970-01-01
    • 2021-06-24
    相关资源
    最近更新 更多