动态图表显示(曲线图) - (第三十八讲)
视频讲解如下:
源码下载,提取码:ud12
https://pan.baidu.com/s/1qAJG9bvBAZ12fM36_oG95g
这里给大家演示WinForm环境下如何使用chart控件进行曲线图的动态显示。
效果如下

实现代码如下:
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms.DataVisualization.Charting;
namespace WindowsFormsApp
{
public class MyChart
{
public void ChartInit(Chart chart, string TabName, List<ChartData> value)
{
#region 定义图表区域、设置图表显示样式
chart.ChartAreas.Clear();
ChartArea chartArea = new ChartArea("C1");
// 允许X轴放大
chartArea.CursorX.IsUserEnabled = true;
chartArea.CursorX.AutoScroll = true;
chartArea.CursorX.IsUserSelectionEnabled = true;
chartArea.CursorX.Interval = 1D;
chartArea.CursorX.IntervalOffset = 0;
chartArea.CursorX.IntervalOffsetType = DateTimeIntervalType.Seconds;
chartArea.CursorX.IntervalType = DateTimeIntervalType.Seconds;
chartArea.CursorX.LineColor = Color.Blue;
// 允许Y轴放大
chartArea.CursorY.IsUserEnabled = true;
chartArea.CursorY.AutoScroll = true;
chartArea.CursorY.IsUserSelectionEnabled = true;
chartArea.CursorY.Interval = 1D;
chartArea.CursorY.IntervalOffset = 0;
chartArea.CursorY.IntervalOffsetType = DateTimeIntervalType.Seconds;
chartArea.CursorY.IntervalType = DateTimeIntervalType.Seconds;
chartArea.CursorY.LineColor = Color.Blue;
// chartArea.AxisX.Interval = 1; // 设置轴的间隔(这个不能开)
//chartArea.AxisX.IsInterlaced = true; // 交错网格
chartArea.AxisX.IsStartedFromZero = false;
chartArea.AxisX.MajorGrid.LineColor = Color.Silver;
chartArea.AxisX.MajorGrid.Enabled = true;
chartArea.AxisX.ScrollBar.Enabled = true;
chartArea.AxisX.IntervalAutoMode = IntervalAutoMode.FixedCount;
chartArea.AxisX.IntervalType = DateTimeIntervalType.NotSet;
chartArea.AxisX.ScrollBar.ButtonStyle = ScrollBarButtonStyles.All;//启用X轴滚动条按钮
chartArea.AxisX.ScaleView.Scroll(ScrollType.Last);
chartArea.AxisX.LabelStyle.Format = "HH:mm:ss"; // 设置时间作为X轴
chartArea.AxisX.LabelStyle.IntervalType = DateTimeIntervalType.Seconds;
chartArea.AxisX.LabelStyle.Interval = 1; //坐标值间隔1S
chartArea.AxisX.LabelStyle.IsEndLabelVisible = false; //防止X轴坐标跳跃
chartArea.AxisX.LabelStyle.Angle = -90;
chartArea.AxisX.LabelStyle.Font = new Font("微软雅黑", 10f);
chartArea.AxisX.MajorGrid.IntervalType = DateTimeIntervalType.Seconds;
chartArea.AxisX.MajorGrid.Interval = 1; //网格间隔
chartArea.AxisX.Minimum = DateTime.Now.ToOADate(); //当前时间
chartArea.AxisX.Maximum = DateTime.Now.ToOADate();
chartArea.AxisX.ScaleView.Zoomable = true; // 允许X轴放大
chartArea.AxisX.ScrollBar.IsPositionedInside = false;
//设置图表显示样式
//chartArea.AxisY.Minimum = DateTime.Now.ToOADate(); // Y轴最小值
//chartArea.AxisY.Maximum = DateTime.Now.ToOADate(); // Y轴最大值
//chartArea.AxisY.IsStartedFromZero = false;
//chartArea.AxisY.MajorGrid.Enabled = true;
// 背景样式
chartArea.BackColor = Color.White; //背景色
chartArea.BackSecondaryColor = Color.White; //渐变背景色
chartArea.BackGradientStyle = GradientStyle.TopBottom; //渐变方式
chartArea.BackHatchStyle = ChartHatchStyle.None; //背景阴影
chartArea.BorderDashStyle = ChartDashStyle.NotSet; //边框线样式
chartArea.BorderWidth = 1; //边框宽度
chartArea.BorderColor = Color.Black;
chart.ChartAreas.Add(chartArea);
#endregion
#region Series 数据初始化
chart.Series.Clear();
foreach (ChartData c in value)
{
Series series = new Series(c.Name);
series.ChartArea = "C1";
series.Color = c.color;
series.Points.Clear();
series.XValueType = ChartValueType.Time;
series.YValueType = ChartValueType.Double;
series.BorderWidth = 1;
series.MarkerColor = Color.Green;
series.MarkerSize = 7;
series.MarkerStyle = MarkerStyle.None; // MarkerStyle.Circle
series.ChartType = SeriesChartType.Line; // Line折线图 Spline 曲线图
series.IsValueShownAsLabel = false; // 是否在标签上显示数值
chart.Series.Add(series);
series.ToolTip = "时间:#VALX\n当前值:#VALY\n最大值:#MAX\n最小值:#MIN\n平均值:#AVG";
}
#endregion
#region 设置标题等样式
chart.Titles.Clear();
chart.Titles.Add("n1");
chart.Titles[0].Text = TabName;
chart.Titles[0].ForeColor = Color.RoyalBlue;
chart.Titles[0].Font = new System.Drawing.Font("Microsoft Sans Serif", 12F);
// 设置边框
chart.BackGradientStyle = GradientStyle.TopBottom;
chart.BorderlineColor = Color.FromArgb(26, 59, 105);
chart.BorderlineDashStyle = ChartDashStyle.Solid;
chart.BorderlineWidth = 1;
chart.BorderSkin.SkinStyle = BorderSkinStyle.Emboss;
#endregion
}
}
public class ChartData
{
/// <summary>
/// 曲线名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// 曲线颜色
/// </summary>
public Color color { get; set; }
}
}
调用方式如下:
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
namespace WindowsFormsApp
{
public partial class Form1 : Form
{
/// <summary>
/// 横坐标最初值
/// </summary>
private DateTime X_minValue;
/// <summary>
/// 随机数
/// </summary>
private Random rand = new Random();
/// <summary>
/// 曲线个数,最大值6
/// </summary>
private int LineNum { get; set; } = 6;
public Form1()
{
InitializeComponent();
}
/// <summary>
/// 不停的添加数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void timer1_Tick(object sender, EventArgs e)
{
try
{
// 添加数据
for (int i = 0; i < LineNum; i++)
this.chart1.Series[i].Points.AddXY(DateTime.Now.ToOADate(), rand.Next(5, 20));
// X坐标后移1秒
this.chart1.ChartAreas[0].AxisX.Maximum = DateTime.Now.AddSeconds(1).ToOADate();
if (checkBox1.Checked == true)
chart1.ChartAreas[0].AxisX.Minimum = DateTime.Now.AddSeconds(-10).ToOADate();//此刻后10分钟作为最初X轴,
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
}
}
/// <summary>
/// 初始化
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
// 初始化模式数据的设置
List<Color> c = new List<Color>() { Color.Red, Color.Yellow, Color.Blue, Color.Lime, Color.Fuchsia, Color.Green };
List<ChartData> data = new List<ChartData>();
for (int i = 0; i < LineNum; i++)
{
data.Add(new ChartData() { Name = $"c{i + 1}", color = c[i] });
}
// x轴最小刻度
X_minValue = DateTime.Now;
// 初始化chart1
new MyChart().ChartInit(chart1, "这是表名", data);
}
/// <summary>
/// 开始
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
this.timer1.Enabled = true;
}
/// <summary>
/// 停止
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button3_Click(object sender, EventArgs e)
{
this.timer1.Enabled = false;
}
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
if (checkBox1.Checked == false) //X轴设置成显示最初时间坐标
chart1.ChartAreas[0].AxisX.Minimum = X_minValue.ToOADate(); //最初打开时候为X轴
}
private void button4_Click(object sender, EventArgs e)
{
chart1.ChartAreas[0].AxisX.Minimum = DateTime.Now.AddSeconds(-3).ToOADate();//此刻后三秒
}
private void button5_Click(object sender, EventArgs e)
{
chart1.ChartAreas[0].AxisX.Minimum = X_minValue.ToOADate();
}
}
}