用VB.net編程序的時(shí)候,繪制數(shù)據(jù)圖表一直是一個(gè)令人頭疼的事情。用graphics方法一條一條線的畫(huà),程序極其繁瑣,光是坐標(biāo)變換就搞死人了。當(dāng)然,輸出一些比較特殊的圖形的時(shí)候這是唯一的方法,但是如果只想要畫(huà)個(gè)直方圖或者折線圖什么的真是殺雞用牛刀。
貌似在VB6時(shí)代就出現(xiàn)了MSChart控件,利用Excel的內(nèi)核來(lái)繪制簡(jiǎn)單的統(tǒng)計(jì)圖。記得當(dāng)年好像必須要綁定數(shù)據(jù)控件,從SQL或者Access中綁定數(shù)據(jù),麻煩無(wú)比,從來(lái)沒(méi)搞明白過(guò)。到了.net
framework 4.0時(shí)代(VB.net
2010),這個(gè)控件直接集成進(jìn)來(lái)了,稱(chēng)為Chart控件,據(jù)說(shuō)方便了很多,可以直接用程序往里面很方便地加數(shù)據(jù)點(diǎn)。網(wǎng)上的各種教程相當(dāng)?shù)纳?,因此自己參照了許多教程來(lái)編了個(gè)簡(jiǎn)單的程序。在這里總結(jié)一下學(xué)習(xí)心得。
首先,就是在窗體上加一個(gè)Chart控件:
![[轉(zhuǎn)載]技術(shù)宅:VB.net <wbr>Chart控件繪制數(shù)據(jù)圖表 [轉(zhuǎn)載]技術(shù)宅:VB.net <wbr>Chart控件繪制數(shù)據(jù)圖表](http://image109.360doc.com/DownloadImg/2021/08/0315/227567754_1_20210803035408613) 
在窗體上調(diào)整其大小,默認(rèn)就已經(jīng)有一個(gè)柱狀圖了:
![[轉(zhuǎn)載]技術(shù)宅:VB.net <wbr>Chart控件繪制數(shù)據(jù)圖表 [轉(zhuǎn)載]技術(shù)宅:VB.net <wbr>Chart控件繪制數(shù)據(jù)圖表](http://image109.360doc.com/DownloadImg/2021/08/0315/227567754_2_20210803035408800) 
在這個(gè)控件內(nèi),分為幾個(gè)層次:
一個(gè)Chart控件內(nèi)可以包含若干個(gè)ChartArea,每個(gè)ChartArea相當(dāng)于一個(gè)圖、一個(gè)坐標(biāo)軸(類(lèi)似MATLAB里面的subplot的概念)
一個(gè)ChartArea里面有若干個(gè)Series,就是數(shù)據(jù)系列(套用Excel里面的概念),例如一組直方圖的數(shù)據(jù)就是一個(gè)Series,一條折線數(shù)據(jù)也是一個(gè)Series
下圖可以說(shuō)明這種包含關(guān)系:
![[轉(zhuǎn)載]技術(shù)宅:VB.net <wbr>Chart控件繪制數(shù)據(jù)圖表 [轉(zhuǎn)載]技術(shù)宅:VB.net <wbr>Chart控件繪制數(shù)據(jù)圖表](http://image109.360doc.com/DownloadImg/2021/08/0315/227567754_3_20210803035409160) 
上圖中所有的東西都是可以設(shè)置的,因此全部命令巨復(fù)雜無(wú)比,但知道了各種對(duì)象的包含關(guān)系,就可以很容易地在幫助里面找到了。
這里是一個(gè)簡(jiǎn)單的示例:http://jzcqx.blog.163.com/blog/static/31170512009813017295/
下面以我編的一段程序來(lái)說(shuō)明:
 
          
'繪制柱形圖
           
Chart1.ChartAreas.Clear()
           
Dim ChartAreas1 As New ChartArea("Read
length")   
'定義新的ChartArea
           
Chart1.ChartAreas.Add(ChartAreas1)                
'將新定義的ChartArea加入Chart1
           
Chart1.ChartAreas(0).AxisX.Title = "Length
(nt)"   '設(shè)置ChartArea里坐標(biāo)軸標(biāo)題
           
Chart1.ChartAreas(0).AxisY.Title = "Read count"
           
Chart1.Series.Clear()
           
Dim series1 As New Series("Read Count")
           
series1.ChartType =
SeriesChartType.Column        
'設(shè)置Series的繪圖類(lèi)型
           
Chart1.Series.Add(series1)
           
For i = minlen To maxlen
               
Chart1.Series("Read Count").Points.AddXY(i,
l(i))   
'為這個(gè)Series加數(shù)據(jù)點(diǎn)
           
Next
           
Chart1.Legends(0).Docking =
Docking.Top             
'調(diào)整圖例的位置
輸出結(jié)果:
![[轉(zhuǎn)載]技術(shù)宅:VB.net <wbr>Chart控件繪制數(shù)據(jù)圖表 [轉(zhuǎn)載]技術(shù)宅:VB.net <wbr>Chart控件繪制數(shù)據(jù)圖表](http://image109.360doc.com/DownloadImg/2021/08/0315/227567754_4_20210803035409535)
很簡(jiǎn)單,也很樸實(shí),但讓人看著也算心曠神怡和一目了然,最重要的是避免了寫(xiě)大量代碼用于坑爹的坐標(biāo)變換和坐標(biāo)軸自適應(yīng)。
下面再來(lái)說(shuō)說(shuō)如何將繪制的數(shù)據(jù)圖表保存起來(lái)。Chart對(duì)象有一個(gè)方法叫SaveImage,直接就能將圖表存為BMP,JPG,PNG,TIF等位圖格式,更重要的是還能直接存成EMF格式的矢量圖!這樣就不怕后期放大了。
命令嘛,很簡(jiǎn)單:
Chart1.SaveImage(SaveFileDialog1.FileName,
ChartImageFormat.Png)
當(dāng)然,真要輸出很精美的圖表,還是建議把數(shù)據(jù)輸出到Excel或者M(jìn)ATLAB里面去慢慢調(diào)整。VB.NET里面隨便畫(huà)一下,只不過(guò)是為了方便分析數(shù)據(jù)時(shí)簡(jiǎn)單直觀地預(yù)覽數(shù)據(jù)分布而已。