询问者
System.Windows.Forms.DataVisualization.Charting.Chart问题

问题
-
使用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点开始画,怎样实现?
全部回复
-
就一个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里面的数据都是有效的,但有缺测时次数据,如果缺测时次为第一个和最后一个,横坐标将从实际有的数据的横坐标开始显示,但我仍然希望横坐标从缺测时次开始显示,而实际显示曲线的时候从实际有数据的点开始画
麻烦你能写个简单的处理代码吗?
-
不知您合不合用:
//设置数据 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 -
对不住,方才误解您了,
您试试这段吧:
//设置数据 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