mschart示例和技巧
一
二
打开MSDN,在“索引”页写下“MSChart 控件”回车,会有详细的使用说明,以下示例摘自MSDN:
MSChart 控件示例
下面的示例显示一个具有8 行8 列数据的三维图表,并设置了图例的参数。
Private Sub Command1_Click()
With MSChart1
'显示一个具有8 行8 列数据的三维图表。
.ChartType = VtChChartType3dBar
.ColumnCount = 8
.RowCount = 8
For column = 1 To 8
For row = 1 To 8
.Column = column
.Row = row
.Data = row * 10
Next row
Next column
'将图表作为图例的背景。
.ShowLegend = True
.SelectPart VtChPartTypePlot, index1, index2, _
index3, index4
.EditCopy
.SelectPart VtChPartTypeLegend, index1, _
index2, index3, index4
.EditPaste
End With
End Sub
三
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''''''
'过程名: subCurveInit
'作用: 初始化MSChart,使其满足作图要求
'说明: 作图时如下:
' 当设置图形为二维散点图,画一条曲线时需定义一个二维数组MyData(0 to n,0 to 1),赋值方法如下
' ******* X轴********y轴*******
' MyData(0,0)=1:MyData(0,1)=1
' MyData(1,0)=1:MyData(1,1)=1
' .........
' MyData(n,0)=1:MyData(n,1)=1
' 当为两条曲线时定义MyData(0 to n,0 to 3),赋值如下
' 第一条:**X轴***y轴******第二条:*****X轴******y轴******* ' MyData(0,0)=1:MyData(0,1)=1:MyData(0,2)=1:MyData(0,3)=1
' MyData(1,0)=1:MyData(1,1)=1:MyData(1,2)=1:MyData(1,3)=1
' .........
' MyData(n,0)=1:MyData(n,1)=1:MyData(n,2)=1:MyData(n,3)=1
' 当为多条曲线的时候依此类推定义Mydata数组
' 设置曲线相关属性可对.Plot.SeriesCollection(x)的子属性进行操作完成.(x为第几条曲线)
' 最后令.ChartData = MyData即可
'修改历史:
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '''''''''''''''''''''''''''''''''
Dim MyData!(0 To 5, 0 To 3)
Public Sub subCurveInit(Optional intAxisXMax As Integer, Optional intAxisXMin As Integer)
'//判断是否需要修改X轴显示范围,用于动态显示
With frmMain.chaCurve
If intAxisXMax <> 0 Then '//是否需要修改最X轴最大值
.Plot.Axis(VtChAxisIdX).ValueScale.Maximum = intAxisXMax '//X轴最大值
If intAxisXMax <> 0 Then '//是否修改X轴最小值
.Plot.Axis(VtChAxisIdX).ValueScale.Minimum = intAxisXMin '//X轴最小值
End If
Else '//如果无需修改X轴最大或最小值,进行以下初始化工作
.TitleText = "温度/时间" '//标题
.Title.VtFont.VtColor.Set 255, 255, 0 '//标题颜色
'//对两条曲线的颜色和粗细设置
.ColumnCount = 4 '//当设置图形为二维散点图时.一条曲线需两个Column,例如两条曲线时,只需对Column=1和3操作,就可完成各自属性设置
.Plot.SeriesCollection(1).Pen.VtColor.Set 0, 0, 255 '//第一条为理想曲线,设置为蓝色
.Plot.SeriesCollection(1).Pen.Width = 10 '//设置为较细
.Plot.SeriesCollection(3).Pen.VtColor.Set 255, 0, 0 '//第二条为实际曲线,设置为红色
.Plot.SeriesCollection(3).Pen.Width = 10 '//设置为较细
'//设置X,Y轴不自动缩放,固定大小
.Plot.Axis(VtChAxisIdX).ValueScale.Auto = False
.Plot.Axis(VtChAxisIdY).ValueScale.Auto = False
'// 设置X轴的最大值和最小值
.Plot.Axis(VtChAxisIdX).ValueScale.Maximum = 250 '//X轴最大值
.Plot.Axis(VtChAxisIdX).ValueScale.Minimum = 0 '//X轴最小值
'// 设置Y轴最大值和最小值
.Plot.Axis(VtChAxisIdY).ValueScale.Maximum = 100 '//Y轴最大值
.Plot.Axis(VtChAxisIdY).ValueScale.Minimum = -50 '//Y轴最小值
'//设置网格
.Plot.Axis(VtChAxisIdX).ValueScale.MajorDivision = 25 '//X轴主要网格数量
.Plot.Axis(VtChAxisIdY).ValueScale.MajorDivision = 15 '//Y轴主要网格数量
.Plot.Axis(VtChAxisIdX).ValueScale.MinorDivision = 5 '//X轴次要网格数量
.Plot.Axis(VtChAxisIdX).AxisGrid.MinorPen.Style = VtPenStyleNull '//X轴次要网格不显示
.Plot.Axis(VtChAxisIdY).ValueScale.MinorDivision = 0 '//Y轴次要网格数量
.Plot.Axis(VtChAxisIdX).AxisGrid.MajorPen.Style = VtPenStyleSolid '//X轴网格为实线
.Plot.Axis(VtChAxisIdY).AxisGrid.MajorPen.Style = VtPenStyleSolid '//Y轴网格为实线
'//设置坐标系在MSChart控件框中的大小
.Plot.AutoLayout = False '//改为手动设置大小
.Plot.LocationRect.Min.X = 0
.Plot.LocationRect.Min.Y = 0 '//设置最小坐标位置为0,即坐标系顶部和左边都靠着MSChart的边框
.Plot.LocationRect.Max.X = .Width
.Plot.LocationRect.Max.Y = .Height '//设置最大值为MSChart边框的长和宽,使坐标系右边和底部靠着边框
.Plot.UniformAxis = False '//指定图表的所有值坐标轴的单位刻度不一致(X,Y轴坐标不需要一致).
'//设置图形类型
.chartType = VtChChartType2dXY '//设置图形为二维散点图
.ChartData = MyData '//可有可无,目的是防止初始显示时曲线框内显示杂乱曲线
End If
End With
End Sub
Private Sub Form_Load()
MyData(0, 0) = 50: MyData(0, 1) = 80: MyData(0, 2) = 50: MyData(0, 3) = 30
MyData(1, 0) = 100: MyData(1, 1) = 70: MyData(1, 2) = 100: MyData(1, 3) = 60
MyData(2, 0) = 150: MyData(2, 1) = 60: MyData(2, 2) = 150: MyData(2, 3) = 50
MyData(3, 0) = 200: MyData(3, 1) = 90: MyData(3, 2) = 200: MyData(3, 3) = 90
MyData(4, 0) = 210: MyData(4, 1) = 50: MyData(4, 2) = 230: MyData(4, 3) = 40
MyData(5, 0) = 250: MyData(5, 1) = 50: MyData(5, 2) = 250: MyData(5, 3) = 40
subCurveInit
End Sub
四
MSCHART的使用之vb中利用MSCHART控件画二维散点图2008年03月31日星期一 16:12近日在学习傅立叶分解时,写了个小程序来验证自己对傅立叶分解的一些理解,为了更生动直观就需要画一些图形,以前总是用picture控件来实现,后来在网上看到VB中有个MSCHART控件可以来画很多类型的图形,就学习了一下,由于是第一次搞,所以按习惯在网上搜索相关帖子,发现没有一个很完整的关于MSCHART中二维散点图的例子,很是郁闷,经过我自己几天的努力,终于解决了这个问题.现以一个具体的例子来说明,希望我的这个例子能对大家有所帮助.这个例子是一个论坛上一位网友提出来的,但是这个问题一直到现在还没有人回答,我权当在这里回答一下吧.问题如下:
Private Sub Form_Load()
'对于二维散点图来说,第一列代表了X轴坐标,第二列代表了Y轴坐标
'因此在定义二维数据时,第二维定义为0到1,第一维代表了第几点数据,可根据数据点数变化
'下面以数据点数有21点为列子
Dim MyData(20, 1) As Double
'-----x轴坐标值-----Y轴坐标值----------
MyData(0, 0) = 0: MyData(0, 1) = 180 '本句代表了:第一点数据的X轴坐标为0,Y轴坐标为180
MyData(1, 0) = 6: MyData(1, 1) = 60
MyData(2, 0) = 8: MyData(2, 1) = 60
MyData(3, 0) = 11: MyData(3, 1) = 0
MyData(4, 0) = 16: MyData(4, 1) = 0
MyData(5, 0) = 19: MyData(5, 1) = 60
MyData(6, 0) = 25.8: MyData(6, 1) = 60
MyData(7, 0) = 28.8: MyData(7, 1) = 0
MyData(8, 0) = 31.8: MyData(8, 1) = 60
MyData(9, 0) = 40.3: MyData(9, 1) = 60
MyData(10, 0) = 43.3: MyData(10, 1) = 0
MyData(11, 0) = 93.3: MyData(11, 1) = 0
MyData(12, 0) = 96.3: MyData(12, 1) = 60
MyData(13, 0) = 99.3: MyData(13, 1) = 0
MyData(14, 0) = 105.3: MyData(14, 1) = 0
MyData(15, 0) = 135.3: MyData(15, 1) = 0
MyData(16, 0) = 144.3: MyData(16, 1) = 180
MyData(17, 0) = 148.8: MyData(17, 1) = 270
MyData(18, 0) = 405.03: MyData(18, 1) = 270
MyData(19, 0) = 409.53: MyData(19, 1) = 180
MyData(20, 0) = 564.17: MyData(20, 1) = 180
'波形图外观设置
With MSChart1
.TitleText = "速度 m/min"
' '设置图线的外观
.Plot.SeriesCollection(1).Pen.Width = 30
.Plot.SeriesCollection(1).Pen.Style = VtPenStyleSolid
' '设置XY轴
.Plot.Axis(VtChAxisIdX).ValueScale.Auto = False
.Plot.Axis(VtChAxisIdY).ValueScale.Auto = False
'// 设置最大值
.Plot.Axis(VtChAxisIdX).ValueScale.Maximum = 600
.Plot.Axis(VtChAxisIdY).ValueScale.Maximum = 300
'// 设置最小值
.Plot.Axis(VtChAxisIdY).ValueScale.Minimum = 0
.Plot.Axis(VtChAxisIdX).ValueScale.Minimum = 0
'//
.Plot.Axis(VtChAxisIdX).ValueScale.MajorDivision = 6 'X轴主要网格数量
.Plot.Axis(VtChAxisIdY).ValueScale.MajorDivision = 6 'Y轴主要网格数量
.Plot.Axis(VtChAxisIdX).ValueScale.MinorDivision = 0 'X轴次要网格数量
.Plot.Axis(VtChAxisIdY).ValueScale.MinorDivision = 0 'Y轴次要网格数量
.Plot.Axis(VtChAxisIdX).AxisGrid.MajorPen.Style = VtPenStyleDotted
.Plot.Axis(VtChAxisIdY).AxisGrid.MajorPen.Style = VtPenStyleDotted
MSChart1.Plot.AutoLayout = False
MSChart1.Plot.UniformAxis = False
MSChart1.chartType = VtChChartType2dXY '设置图形为二维散点图
MSChart1.ChartData = MyData '数据
End With
End Sub
五
我们同是跟mschart较劲的人啊
我给你一个比较麻烦,但是可控性强的办法就是数组,然后循环给mschar赋值
你是不是用xy的那个模式,想显示温度,时间上的那个点?
如果是这样的话,那么二维数组就够了,一个x,一个y
arrValues(i, 1) = " " '& Format(rs1!时间, "hh:mm ")
arrValues(i, 2) = val(rs.Fields( "温度"))
这样足够让mschart显示横纵坐标交点了
用1,2两条曲线为例
你再循环之前,首先设定rowcount=nums(有可能你每次取出来的recourdcount不同,那
么就要每次调整一下,让rowcount保持那个最大的nums
然后在Next j之前画mschart
这里要说明的是columncount=2*你要取的曲线条数在我用的这个例子里面就是2*2=4
下面我们来画mschart
With chart
For i = 1 To ubound(arrValues)
.DataGrid.SetData i, j, arrValues(i, 1), 0
.DataGrid.SetData i, j+1, arrValues(i, 2), 0
Next i
end with
next j
这样就不会覆盖到前一条了
六
同一个图,同xy数轴,画多条曲线:
Private Sub Command1_Click()
Dim i As Integer, Data() As Single, n As Integer
n = 10
ReDim Data(n, 3) As Single
For i = 0 To n
Data(i, 0) = i '第1条曲线x数据
Data(i, 1) = i * 2 '第1条曲线y数据
Data(i, 2) = Data(i, 0) '关键在这里!第2条曲线x数据(可以和第1条曲线x 数据不同)
Data(i, 3) = i * 3 '第2条曲线y数据
Next i
MSChart1.ChartData = Data
MSChart1.chartType = VtChChartType2dXY
End Sub
七
59 m_Chart.GetPlot().GetSeriesCollection().GetItem(1).GetPen().GetVtColor().Set(0,255,0);
// 设置曲线上数据点颜色
70
m_Chart.GetPlot().GetSeriesCollection().GetItem(1).GetDataPoints().GetItem(-1).GetDataPointL abel().GetVtFont().GetVtColor().Set(0,255,0);