Chart绘图相关知识
Chart控件,功能强大:可以绘制柱状图、折线图、波形图、饼状图,大大简化了对图的开发与定制。
Chart控件的相关概念:
ChartArea: 表示图表区域,一个Chart可以绘制多个ChartArea,重叠在一起。
Series: 表示数据序列,每个ChartArea可以有多个数据线。即,Series属于ChartArea.
AxisX,AxisY: 表示主坐标轴,每一个ChartArea都有对应的坐标轴,包括主坐标轴,辅坐标轴
Queue集合: 表示先进先出的集合。
Queue主要有两个方法: 1. Dequeue() 表示移除并返回位于 System.Collections.Generic.Queue 开始处的对象。 2. Enqueue() 表示将对象添加到 System.Collections.Generic.Queue 的结尾处。
其他用到知识:
Timer 定时器: 定时执行相应的功能,更新数据,刷新图表。
效果图 如下【先点击初始化按钮,再点击开始按钮】:
一、折线图【折线图,是取[0,100]之间的随即数进行填充】:
二、波形图【波形图,是取正玄值,并放大50倍,然后上移50】
核心代码
实验错误经验:在窗体代码前要增加以下声明代码才能使用 ChartArea 这些类,ChartArea 完整名字为: System.Windows.Forms.DataVisualization.Charting.ChartArea
1 using System.Windows.Forms.DataVisualization.Charting;
完整源码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Windows.Forms.DataVisualization.Charting;namespace WindowsFormsApplication1 { public partial class RealChart : Form { private Queue <double > dataQueue = new Queue<double >(100 ); private int curValue = 0 ; private int num = 5 ; public RealChart ( ) { InitializeComponent(); } private void btnInit_Click (object sender, EventArgs e ) { InitChart(); } private void btnStart_Click (object sender, EventArgs e ) { this .timer1.Start(); } private void btnStop_Click (object sender, EventArgs e ) { this .timer1.Stop(); } private void timer1_Tick (object sender, EventArgs e ) { UpdateQueueValue(); this .chart1.Series[0 ].Points.Clear(); for (int i=0 ;i<dataQueue.Count;i++){ this .chart1.Series[0 ].Points.AddXY((i+1 ), dataQueue.ElementAt(i)); } } private void InitChart ( ) { this .chart1.ChartAreas.Clear(); ChartArea chartArea1 = new ChartArea("C1" ); this .chart1.ChartAreas.Add(chartArea1); this .chart1.Series.Clear(); Series series1 = new Series("S1" ); series1.ChartArea = "C1" ; this .chart1.Series.Add(series1); this .chart1.ChartAreas[0 ].AxisY.Minimum = 0 ; this .chart1.ChartAreas[0 ].AxisY.Maximum =100 ; this .chart1.ChartAreas[0 ].AxisX.Interval = 5 ; this .chart1.ChartAreas[0 ].AxisX.MajorGrid.LineColor = System.Drawing.Color.Silver; this .chart1.ChartAreas[0 ].AxisY.MajorGrid.LineColor = System.Drawing.Color.Silver; this .chart1.Titles.Clear(); this .chart1.Titles.Add("S01" ); this .chart1.Titles[0 ].Text = "XXX显示" ; this .chart1.Titles[0 ].ForeColor = Color.RoyalBlue; this .chart1.Titles[0 ].Font = new System.Drawing.Font("Microsoft Sans Serif" , 12F ); this .chart1.Series[0 ].Color = Color.Red; if (rb1.Checked) { this .chart1.Titles[0 ].Text =string .Format( "XXX {0} 显示" ,rb1.Text); this .chart1.Series[0 ].ChartType = SeriesChartType.Line; } if (rb2.Checked) { this .chart1.Titles[0 ].Text = string .Format("XXX {0} 显示" , rb2.Text); this .chart1.Series[0 ].ChartType = SeriesChartType.Spline; } this .chart1.Series[0 ].Points.Clear(); } private void UpdateQueueValue ( ) { if (dataQueue.Count > 100 ) { for (int i = 0 ; i < num; i++) { dataQueue.Dequeue(); } } if (rb1.Checked) { Random r = new Random(); for (int i = 0 ; i < num; i++) { dataQueue.Enqueue(r.Next(0 , 100 )); } } if (rb2.Checked) { for (int i = 0 ; i < num; i++) { curValue = curValue % 360 ; dataQueue.Enqueue((50 *Math.Sin(curValue*Math.PI / 180 ))+50 ); curValue=curValue+10 ; } } } } }
备注 关于定时器Timer【微软自带的控件】:
说明:表示在相同的时间间隔,引发用户自定义的事情 。实现用户需要的功能。本例中是用来定时更新队列中的数据,并刷新图表。
常用说明:
Interval 时间间隔,以毫秒为单位,本例是300毫秒。
Tick 定时触发的事件,本例对应timer1_Tick事件方法。
Start(),Stop() 表示定时器的启动和停止。Enabled 表示定时器是否启用,默认值为 false,需要手动设置为true。
相关链接
C# 绘制实时折线图,波形图 —>原文出处
C# 实时折线图,波形图
=================我是分割线=================
欢迎到公众号来唠嗑: