将固定值设置为图表的X轴

时间:2019-08-25 00:39:24

标签: c# mschart

问题是我想为3种类型的图表设置一些固定值:

  1. 首先是一个星期图,因此它需要在X轴上具有星期日至星期六的值。

  2. 第二个是月份,因此必须设置当前月份的日期

  3. 最后一个年份图表需要显示从1到12或从1月到12月的月份。

我确实看了很多教程,但是像我想要的那些设置点中的大多数,大多数都教如何设置X和Y点,但是我想要一个固定的X点并从数据库中获取Y点。

This is an example of what I need

2 个答案:

答案 0 :(得分:0)

要获取这些固定范围:

enter image description here enter image description here enter image description here

我已经按照如下方式设置了图表:

private void rb_range_CheckedChanged(object sender, EventArgs e)
{

    Chart chart = chart8;
    Series s = chart.Series[0];
    s.ChartType = SeriesChartType.Line;
    s.XValueType = ChartValueType.DateTime;
    s.YValueType = ChartValueType.Double;
    Axis ax = chart.ChartAreas[0].AxisX;
    Axis ay = chart.ChartAreas[0].AxisY;

    //ax.IsMarginVisible = true;  // max or may be necessary

    ax.Interval = 1;

    if (rb_week.Checked)
    {
        setValues('w', 123);

        ax.IntervalType = DateTimeIntervalType.Days;
        ax.LabelStyle.Format = "dddd";
    }
    else if (rb_month.Checked)
    {
        setValues('m', 123);
        ax.IntervalType = DateTimeIntervalType.Days;
        ax.LabelStyle.Format = "dd";
    }
    else if (rb_year.Checked)
    {
        setValues('y', 123);
        ax.IntervalType = DateTimeIntervalType.Months;
        ax.LabelStyle.Format = "MMMM";
    }
    s.Points.Clear();
    foreach (var dp in points)  s.Points.Add(dp);
    // after the points are added or bound to you may want to..
    // set the minimum&maximum, but if the data fit you don't have to!
    ax.Minimum = points.Min(x => x.XValue); 
    ax.Maximum = points.Max(x => x.XValue); 
}

一些注意事项:

  • 仅选择或绑定应在图表中显示的日期很重要!如果您在这里犯了错误,限制将被取消!

  • 如果您的数据足够密集,也就是说,如果它们包含了它们所参考的间隔的第一天和最后一天,则可以忽略在x轴上设置“最小值”和“最大值”;在这种情况下,还应包括ax.IsMarginVisible = false;以避免出现来自相邻范围的点。

  • 如果数据稀疏,则可能需要与仅选择第一个和最后一个x值不同地确定MinimumMaximum值。相反,您应该选择正确的DateTime值。请注意,您需要选择实数DateTimes并使用double函数将其转换为ToOADate(),因为轴属性期望值单位。

  • 您可以研究我用于创建数据的代码,以获取有关如何获取给定星期,月份或年份的第一天和最后一天的日期的提示。

  • 请注意我如何使用DateTime.DaysInMonth来获取给定月份的正确天数

  • 如果您选择Column作为ChartType,则第一列和最后一列可能会被剪切。对于这种情况,您可以通过向Maximum添加半个单位并从Minimum中减去一个单位来扩展范围。您可能还需要向IntervalOffset添加这样的金额。

这是我设置points的方式:

List<DataPoint> points = new List<DataPoint>();

void setValues(char time, int rand)
{
    Random rnd = new Random(rand);  // random data values
    points = new List<DataPoint>();
    DateTime dn = DateTime.Now;
    DateTime dw = new DateTime(dn.Year, dn.Month, dn.Day % 7 + 1); //my weeks start on monday
    DateTime dm = new DateTime(dn.Year, dn.Month, 1);
    DateTime dy = new DateTime(dn.Year, 1, 1);

    if (time == 'w') for (int i = 0; i < 7; i++)
            points.Add(new DataPoint(dw.AddDays(i).ToOADate(), rnd.Next(100) + 50));
    if (time == 'm') for (int i = 0; i < DateTime.DaysInMonth(dn.Year, dn.Month); i++)
            points.Add(new DataPoint(dm.AddDays(i).ToOADate(), rnd.Next(100) + 50));
    if (time == 'y') for (int i = 0; i < 12; i++)
            points.Add(new DataPoint(dy.AddMonths(i).ToOADate(), rnd.Next(100) + 50));
}

答案 1 :(得分:0)

好吧,我有一个关于如何在周图表上设置点的问题。

首先,我没有1个图表和多个rad。相反,我有3张图表,每张一张。即时通讯现在与周线图有关。

我将setvalues代码修改为下一个以插入每日数据

void setvalues(double total, DateTime date)
    {
        points = new List<DataPoint>();
        DateTime dn = DateTime.Now;
        DateTime dw = new DateTime(dn.Year, dn.Month, dn.Day % 7);            
        for (int i = 0; i < 7; i++)
        {
            if (Convert.ToInt32(date.DayOfWeek) == i )
            {
                points.Add(new DataPoint(dw.AddDays(i).ToOADate(), total));
                break;
            }
            else
            {
                points.Add(new DataPoint(dw.AddDays(i).ToOADate(), 0));
            }
        }
    }

但是看起来像这样

weekley chart

红色的日子名称是它的显示方式,绿色的是我真正设置该信息时的方式。

我该如何解决以在星期一等显示星期一信息?