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

setting fixed values to X axis of a chart

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

  1. 首先是周图,因此它需要在 X 轴上有周日到周六的值。

  2. 第二个是月份所以必须设置当月的天数

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

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

要获得这些固定范围:

我是这样设置图表的:

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

一些注意事项:

  • 重要的是 select 或者只绑定那些应该进入图表的日期!如果您在这里犯错,限制将被取消!

  • 如果你的数据足够密集,也就是说,如果他们包括了他们所指的时间间隔的第一天和最后一天,你可以省略设置x轴上的Minimum和Maximum;在这种情况下,还包括 ax.IsMarginVisible = false; 以避免出现相邻范围的点。

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

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

  • 请注意我如何使用 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 个图表和多个 rads。相反,我有 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

红色天数是它的显示方式,绿色是我真正设置该信息的时间。

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