none
System.Windows.Forms.DataVisualization.Charting.Chart问题 RRS feed

  • 问题

  • 使用System.Windows.Forms.DataVisualization.Charting.Chart画个24小时的曲线图

    比如画0-23小时的图,横坐标使用日期时间,纵坐标使用double值,如下:

     targetchart.ChartArea[0].AxisX.IntervalType = DateTimeIntervalType.Hours;
     targetchart.ChartArea[0].AxisX.Interval = 1;

    在增加点的时候

    for (int i = 0; i <= 23;i++ )
    {
       targetchart.Series[0].Points.AddXY(DateTime.Parse("2013-5-8 0:00:00").AddHours(i), random.Next(5, 75));
    }

    在实际情况中,如果0点的值缺了,chart将不会画出这个点,直接从1点开始画,横标作也是从1点开始

    现在的问题就是:如果0点的值缺了,我仍然需要画出0点的横坐标,也就是横坐标从0点开始,而实际的点从1点开始画,怎样实现?

    2013年5月9日 7:55

全部回复

  • 能贴多些代码么?

    这问题与您 ChartArea 的 index 和 for 里边的 int i 有关,

    得添个 flag 才行



    Best regards

    2013年5月9日 14:55
  • 就一个ChartArea 和一个Series

    //设置刻度
            public void InitChartAreaAxis(Chart targetChart)
            {
                ChartArea TempChartArea = targetChart.ChartAreas[0];
                // Enable X axis margin
                TempChartArea.AxisX.IsMarginVisible = false;

                TempChartArea.AxisX.IntervalType = DateTimeIntervalType.Hours;
                TempChartArea.AxisX.IsMarksNextToAxis = true;
                TempChartArea.AxisX.Interval = 4;
                TempChartArea.AxisX.IntervalOffsetType = DateTimeIntervalType.Hours;
                TempChartArea.AxisX.IntervalOffset = 2;
                TempChartArea.AxisX.IntervalAutoMode = IntervalAutoMode.FixedCount;
                //TempChartArea.AxisX.;
                TempChartArea.AxisX.LabelStyle.Font = new Font("微软雅黑", 18);
                TempChartArea.AxisX.LabelStyle.Format = "HH";

                TempChartArea.AxisX.LineWidth = 0;
                TempChartArea.AxisX.MajorGrid.LineWidth = 0;
                TempChartArea.AxisX.MajorGrid.Enabled = false;
                TempChartArea.AxisX.MajorTickMark.Enabled = false;
                TempChartArea.AxisX.MajorGrid.Interval = 4;
                TempChartArea.AxisX.MajorGrid.IntervalOffsetType = DateTimeIntervalType.Hours;
                TempChartArea.AxisX.MajorGrid.IntervalOffset = 2;

                TempChartArea.AxisX.IntervalOffset = 0;
                TempChartArea.AxisX.IntervalAutoMode = IntervalAutoMode.VariableCount;

                //TempChartArea.AxisX.Enabled =AxisEnabled.True;
               
                //Y轴 风速
                TempChartArea.AxisY.IsMarginVisible = false;
                //TempChartArea.AxisY.
                TempChartArea.AxisY.Title = "";
                TempChartArea.AxisY.TitleFont = new Font("微软雅黑", 18);
                TempChartArea.AxisY.LabelStyle.Font = new Font("微软雅黑", 16);
                TempChartArea.AxisY.LineWidth = 0;
                TempChartArea.AxisY.MajorGrid.LineWidth = 0;
                TempChartArea.AxisY.MajorGrid.Enabled = false;
                TempChartArea.AxisY.MajorTickMark.Enabled = false;
                TempChartArea.AxisY.Enabled = AxisEnabled.True;
            }

    //设置系列
            public void InitChartSeries(Chart targetChart)
            {
                //设置系列 Series
                targetChart.Series.Clear();

                targetChart.Series.Add("Series1");

                foreach (Series TempSeries in targetChart.Series)
                {
                    // Set series chart type
                    TempSeries.ChartType = SeriesChartType.Line;
                    TempSeries.BorderWidth = 8;
                    TempSeries.ShadowColor = System.Drawing.Color.Black;
                    TempSeries.ShadowOffset = 1;
                    TempSeries.BorderColor = this.ChartColorsList[index].SeriesBorderColor;
                    //系列上点的大小
                    TempSeries.MarkerSize = 16;
                    //系列上点的形状
                    TempSeries.MarkerStyle = MarkerStyle.Circle;
                    // Set point labels
                    TempSeries.IsValueShownAsLabel = false;
                    //系列的X值的类型
                    TempSeries.XValueType = ChartValueType.DateTime;
                    //系列的Y值的类型
                    TempSeries.YValueType = ChartValueType.Double;
                    //系列的刻度值
                    TempSeries.Legend = targetChart.Legends[0].Name;
                    //系列的图标区域
                    TempSeries.ChartArea = targetChart.ChartAreas[0].Name;

                    TempSeries.MarkerColor = Color.FromArgb(243,90,3);
                    TempSeries.Color = Color.FromArgb(255,144,0);
                }
            }

    //设置数据
            public void SetChartData( Chart targetChart, DataView view)
            {
                targetChart.Series[0].Points.Clear();
                for (int i = 0; i < view.Count; i = i + 2)
                {
                    targetChart.Series[0].Points.AddXY(DateTime.Parse(view[i][1].ToString()), (float.Parse(view[i][2].ToString())).ToString("f1"));
                }
            }

    现在的问题就是前面的问题了:就是DataView里面的数据都是有效的,但有缺测时次数据,如果缺测时次为第一个和最后一个,横坐标将从实际有的数据的横坐标开始显示,但我仍然希望横坐标从缺测时次开始显示,而实际显示曲线的时候从实际有数据的点开始画

    麻烦你能写个简单的处理代码吗?

    2013年5月10日 2:01
  • 不知您合不合用:

    //设置数据
    public void SetChartData(Chart targetChart, DataView view)
    {
        targetChart.Series[0].Points.Clear();
    
        DateTime startDateTime = DateTime.Parse(view[0][1].ToString());
    
        if (startDateTime.Hour != 0)
        {
            for (int i = startDateTime.Hour; i > 0; i--)
            {
                targetChart.Series[0].Points.AddXY(startDateTime.AddHours(-i), 0);
            }
        }
    
        for (int i = 0; i < view.Count; i++)
        {
            targetChart.Series[0].Points.AddXY(DateTime.Parse(view[i][1].ToString()), (float.Parse(view[i][2].ToString())).ToString("f1"));
        }
    }
    同时建议您做两个修正:

    TempChartArea.AxisX.Interval = 1;

    TempChartArea.AxisX.MajorGrid.Interval = 1;


    效果会是这样:



    Best regards

    2013年5月10日 16:45
  • 对不住,方才误解您了,

    您试试这段吧:

    //设置数据
    public void SetChartData(Chart targetChart, DataView view)
    {
        targetChart.Series[0].Points.Clear();
    
        object[][] completeHourData = new object[24][];
    
        for (int i = 0; i < view.Count; i++)
        {
            DateTime tempDateTime = DateTime.Parse(view[i][1].ToString());
            float tempSpeed = float.Parse(view[i][2].ToString());
            completeHourData[tempDateTime.Hour] = new object[] { tempDateTime, tempSpeed };
        }
    
        DateTime firstDateTime = (DateTime)completeHourData.First(x => x != null)[0];
    
        for (int i = 0; i < 24; i++)
        {
            if (completeHourData[i] == null)
            {
                targetChart.Series[0].Points.AddXY(firstDateTime.AddHours(i - firstDateTime.Hour), 0);
            }
            else
            {
                targetChart.Series[0].Points.AddXY(DateTime.Parse(completeHourData[i][0].ToString()), (float.Parse(completeHourData[i][1].ToString())).ToString("f1"));
            }
        }
    }



    Best regards

    2013年5月10日 17:43
  • 如上图,我的意思是01-11,18-23之间的点我都不用画出来,直接画00点到12点,17点以后的点我也不用画出来,17点就是最后一个点,但我仍然需要01-11,18-23段的横坐标刻度和标签

    2013年5月13日 1:32