2D 图表显示一般布局提供的数据。数据被装载在 ChartDataArray 对象中,这些对象都有一个类型(type)对象。数据可以用提前装载的数组,也可以在设计时填充数据。
每个图表类型都有一种通用的布局。布局包括一个 X 数组,一个 Y 数组,和 Y1,Y2,Y3, Y4 数组。所有这些数组都可以装载数据,也可以为空。 例如画出一个 XY 图表只需要一个数组系列,只要 X 和 Y 数组有值就可以了,其他的 Y 数组可以为空。另外,不像一组数据的图表,每个数据系列可以有不同数量的点,并且不需要一定和 X 值匹配,这样就能做出下面的图。
为方便起见,一个 PointData 属性(PointF 的一个数组)也可以被用来提供 X 和 Y 的数据。
PointF 的值并不是独立的 X 和 Y 的数组,仅仅是另一种形式的数据输入和输出。PointData 属性值的变化会更改 X 和 Y 的数组,反之亦然。
在作图之前,一个重要的总体设计必须有下面的特征
C1Chart 有一个特殊的层,该层包含数据关联的类,集合和属性。 本章节对每个数据对象的细节和如何访问的信息详细地逐一介绍。
图表中的数据需要被组织到 ChartGroup 对象。每个图表包含两个 ChartGroup(尽管大部
分图表只是使用第一个 ChartGroup),其中每个都被视为一个单独的实体。ChartGroup 允许超过一个图表显示在 ChartArea 并且提供多种对图表特有属性的访问。
在 C1Chart 中,一个 ChartGroup 对象代表一个图表组。ChartGroup 对象被组织到
ChartGroupsCollection 中,ChartGroupsCollection 可以通过 ChartGroups 对象来访问。这个集合提供两种方法访问 ChartGroups.
首先单独的图表组可以通过集合来访问。例如,下面的代码列出了如何通过
ChartGroupsCollection 来访问单独的图表组。
C1Chart1.ChartGroups.ChartGroupsCollection(0).ChartType = Chart2DTypeEnum.XYPlot
c1Chart1.ChartGroups.ChartGroupsCollection\[0\].ChartType = Chart2DTypeEnum.XYPlot; |
其次,ChartGroup 对象的 Group0 和 Group1 属性返回相关的 ChartGroup,并且允许用下列的代码规避长集合名。
Visual Basic
C1Chart1.ChartGroups.Group1.ChartType = Chart2DTypeEnum.XYPlot |
c1Chart1.ChartGroups.Group1.ChartType = Chart2DTypeEnum.XYPlot;
如下面的代码所示,ChartGroupsCollection 允许通常的迭代方法:
Dim cg As ChartGroup For Each cg In C1Chart1.ChartGroups.ChartGroupsCollection cg.ChartType = Chart2DTypeEnum.XYPlot
Next
ChartGroup cg; foreach ( cg In c1Chart1.ChartGroups.ChartGroupsCollection ) cg.ChartType = Chart2DTypeEnum.XYPlot;
ChartGroup 对象还包含 ChartData 对象。ChartData 对象包含 Hole 属性, FunctionsList 属性, 能返回 ChartDataSeries 对象的 SeriesList 属性,PointStylesList 属性和 TrendsList 集合
属性。这个 ChartGroup 对象基本上能够访问所有数据相关的对象和图表的所有属性:
Visual Basic
C1Chart1.ChartGroups.ChartGroupsCollection(0).ChartData |
c1Chart1.ChartGroups.ChartGroupsCollection\[0\].ChartData; |
FunctionsList 集合包含了绘制图表数据和图表区域的函数。FunctionsList 属性能够得到现在的 ChartData 对象关联的 FunctionsCollection 对象。
PointStyles 属性提供了一个机制可以用不同的视觉效果标注特殊的数据点,和同一个数据系列的其他点区分开来。PointStyles 包含在 PointStylesCollection 中。
SeriesList 属性返回一个 ChartDataSeriesCollection,ChartDataSeriesCollection 是一个 ChartDataSeries 对象的集合。ChartDataSeries 对象包含图表的所有系列和数据。Series 对象包含 ChartDataArray,后者持有图表数据。
TrendLine 对象将趋势线分为两组,包括回归和非回归。回归趋势线表示的是包括多项式,指数,对数和傅立叶函数这类关于数据的函数趋势.
ChartData 的对象,还可以访问 Hole 属性,数据的 Hole 可以打破数据集的连续性。
C1Chart 最重要的对象之一就是 ChartDataSeries 对象。这个数据系列包含图表中的所有数据和许多重要的数据相关的属性。
ChartDataSeries 包含在 ChartData 类型的 SeriesList 对象集合中,ChartData 对象是
ChartGroup 的一个对象。
Visual Basic
C1Chart1.ChartGroups.ChartGroupsCollection(0).ChartData.SeriesList(0) |
c1Chart1.ChartGroups.ChartGroupsCollection\[0\].ChartData.SeriesList\[0\]; |
这个系列对象对数据和数据访问来说非常重要,原因有两个:
需要注意的是一个系列点的数量是数据组对象中长的那个元素的数量。例如,一个 XY 图表使用了 X 和 Y 数组。如果 X 有 5 个元素,Y 有 3 个元素,那么点的数量是 5,Y 值剩下的 2 个元素被假定为数据漏洞。即使 Y1 数组有十个元素,点的数量还是 5,因为 XY 图表不使用 Y1 数组。但是,如果图表类型变为 HiLo,那么 XY 和 Y1 都要被使用,所以点的数量是 10.X 和 Y 数组不存在的元素都被假定为数据漏洞。
每个系列包含六个 ChartDataArray 对象。X、Y、Y1、Y2、Y3 数组对象持有数据组和 X 轴, Y 轴,Y1 轴,Y2 轴,Y3 轴对应。第六个数据组对象是 PointData 对象。这个对象的数据是 PointF 数组或者 Point 值。这个对象用于作为 X,Y,Y1,Y2,Y3 数据组对象的替代选择。
每个 ChartDataArray 都是一个只读对象,只能通过两种方法修改。CopyDataIn 和
CopyDataOut 的方法拷贝数据到这些对象,并且从这些对象中返回数据组。
X,Y,Y1,Y2,Y3 数据组对象接收数据类型,这样不同的.NET 数据组类型可以被输入到
ChartDataArray 对象中(除了 PointData)。
在ChartDataSeries对象中,六个ChartDataArray对象包含有绘制图表用的数据组。X,Y,Y1,
Y2,Y3 数据组对象持有并且返回 X 和 Y 轴用的数据组,同时 PointData 数据组对象持有并返回
X 轴和 Y 轴用的 PointF 和 Point 对象。
CopyDataIn 方法
在 C1Chart 中,X,Y,Y1,Y2,Y3 数据组对象接收对象数据类型。因此,不同的.NET 类型数据组可能被输入到 ChartDataArray 对象中(除了 PointData)。ChartDataArray 的 CopyDataIn
方法接收一个对象数据类型(可以是一组不同的类型)并把它装载到数据组中。
一个好的实现应该在图表绘制之前维护数据系列的一套数组,用数组的值更新 C1Chart 数据组对象。这样就能够完全控制数据,并可以批处理数据值。以下代码给出了一个简单的例子,
说明数据组如何被构建并设定到图表的数据组对象中去的:
Visual Basic
Dim xp(9) As Single |
C#
float xp(10); float yp(10); int i;
|
CopyDataOut 方法
CopyDataIn 方法给 ChartDataArray 对象装载数据组,而 CopyDataOut 方法从数据组对象
中提取数据。这个方法返回一个对象数据类型,包含数据组。
Dim xpo As Object Dim cds As ChartDataSeries cds = C1Chart1.ChartGroups.ChartGroupsCollection(0).ChartData.SeriesList(0) xpo = cds.X.CopyDataOut()
object xpo; ChartDataSeries cds; cds = c1Chart1.ChartGroups.ChartGroupsCollection\[0\].ChartData.SeriesList\[0\]; xpo = cds.X.CopyDataOut(); |
为了保证这个对象转换的数据类型正确,CopyDataOut 方法也能够接收 System.Type 参
数,该参数产生一个特定类型的数组。因为参数需要实际的数据类型,代码必须包含 GetType() 函数(typeof()在 c#)来传输正确的类型。在接下来的例子中,使用 CopyDataOut 方法从图表的
ChartDataArray 对象中返回数据组。但是数据组的类型是 Single:
Dim xpo As Single()
Dim ypo As Single()
With C1Chart1.ChartGroups.ChartGroupsCollection(0).ChartData.SeriesList(0) xpo = .X.CopyDataOut(GetType(Single())) ypo = .Y.CopyDataOut(GetType(Single())) End With
ChartDataSeries cds;
cds = c1Chart1.ChartGroups.ChartGroupsCollection\[0\].ChartData.SeriesList\[0\]; float\[\] xpo = cds.X.CopyDataOut(typeof(float\[\])); float\[\] ypo = cds.Y.CopyDataOut(typeof(float\[\])); |
注意: C#用户,CopyDataOut 的实现有一点不同。C#中,数组数据类型不能被设定到类
型对象的变量中。如果对象被转换成了正确的数据类型,数组就能设定到对象中。
Dim xpo() As Single xpo = CType(C1Chart1.ChartGroups.ChartGroupsCollection(0), Single())_
.ChartData.SeriesList(0).X.CopyDataOut(GetType(Single()))
C#
|
Visual Basic
C1Chart1.ChartGroups.Group0.ChartData.SeriesList(0).X(4) = 4 |
c1Chart1.ChartGroups.Group0.ChartData.SeriesList\[0\].X\[4\] = 4; |
从 ChartDataArray 返回值需要一个相似的过程:
Dim xval As Single
xval = C1Chart1.ChartGroups.Group0.ChartData.SeriesList(0).X(4)
float xval;
xval = c1Chart1.ChartGroups.Group0.ChartData.SeriesList\[0\].X\[4\]; |
有时,用字符串的值给 X 轴和 Y 轴作为注释,其他轴用数字作为注释,这是非常方便的。
例如,假设一个数据源包含两列,一个是公司名称(字符串),另一个是这个公司购买 ComponentOne 产品的数量。创建一个条形图来展示这些数据,你可以在 Y 轴创建一个产品数量的系列,然后创建一个数组用于计算数量,并把这个数组作为 X 值。然后给 X 轴创建 ValueLabels,每个公司名称和计算的数量相匹配,从而产生图表如下:
由于这种情况经常发生,C1Chart 接收 ChartDataArray 的字符串,ChartDataArray 会自动
列举字符串的值,并且创建相关轴的 ValueLabels。使用这个功能,就有可能(并且非常容易)把 ChartDataSeries 中的 DataField 属性直接设定为一个字符串的值,并且也能得到字符串的值。
C1Chart1.ChartGroups(0).ChartData.SeriesList(0).X.DataField = "CompanyNames" C1Chart1.ChartGroups(0).ChartData.SeriesList(0).Y.DataField = "UnitsPurchased"
c1Chart1.ChartGroups\[0\].ChartData.SeriesList\[0\].X.DataField = "CompanyNames"; c1Chart1.ChartGroups\[0\].ChartData.SeriesList\[0\].Y.DataField = "UnitsPurchased"; |
C1Chart 允许一些 ChartDataArrays 被绑定,其他的使用 ChartDataSeries 的
AutoEnumerate 属性,或者使用 ChartDataArray 的 CopyDataIn()方法来设定。当数据绑定时,图表使用所有的绑定数据作为定义系列数据的数据源,直接使用这些系列和其他图表属性,在图表的绘图区绘制出来。当 AutoEnumerate 属性设定为 True,ChartDataArrays/系列的 X 值自动设定为索引值。尽管有不同的方法设置数据系列,提供了最大灵活性,还是需要删除额外的默认系列。
例如,上面的条形图,只包含一个系列(包含一个公司购买 ComponentOne 产品的数量)。所以如果使用了数据绑定给 C1Chart 提供输入,那么 4 个默认图表系列中的 3 个就要被删除,
删除这些系列可以在设计时做,也可以在运行时做。
对使用 X 和 Y 轴(XY-Polt,Bar,等等)的图表,PointData 属性非常方便,ChartDataSeries 对象的 Point 属性允许输入一组 PonitF 点值。这个属性对使用点数据的应用非常方便,但是这个数组只能设定 X 和 Y 数据组,这个属性不能改变 Y1,Y2,Y3 数据组的值。
下面的例子创建了一个 PointF 数组,并且把它装载到 ChartDataSersies 中:
Visual Basic
Dim ps() As PointF = _
{ _
New PointF(30.0F, 20.0F), _
New PointF(60.0F, 24.0F), _
New PointF(90.0F, 42.0F), _
New PointF(120.0F, 13.0F), _
New PointF(150.0F, 10.0F) _
}
Dim s As New ChartDataSeries()
C1Chart1.ChartGroups.Group1.ChartData.SeriesList.Add(s) s.PointData.CopyDataIn(ps)
C#
|
本章节描述在 ChartArea 中 ChartDataSeries 如何显示和隐藏排除漏洞,以及如何在
C1Chart 的特定图例中如何排除一个系列
假设有成百个系列需要显示在图表中,由于图表只能这么大,必须控制显示的系列。
ChartDataSeries 的 Display 属性提供了这种功能。Display 属性接受一个 SeriesDisplayEnum 枚举类型。把这个属性设定成不同的值,就允许一个系列被显示,被隐藏或者被排除
值 | 描述 |
SeriesDisplayEnum.Show | 系列显示在 ChartArea 中,这是默认值。 |
SeriesDisplayEnum.Hide | 系列不显示在 ChartArea 中,但是 |
SeriesDisplayEnum.Exclude | 系列不会显示在 ChartArea 中,但是 |
SeriesDisplayEnum.ExcludeHoles | 系列显示,但是 Data Hole 值被忽略。 |
有时图形的形状,线和曲线不代表数据,更希望代表数据区域,例如代表误差范围,等等。
在这种情况下,多余的系列可能被加到图形图表中,但是应该在图例中除去,每个
ChartDataSeries 包含一个叫做 LegendEntry 的 Boolean 属性,如果设定成 True,也就是默认值,该系列将列在图例中,如果是 False,这个系列还是会被画出来,但是不会别列到图例中。
数据集,尤其当他们是动态创建的,有时会有不规则的属性,很难让一个绘图控件来处理。
因此,在把数据绘制到图表之前,花费了大量的时间,计算这些不一致的数据。虽然 C1Chart 不能自动改变这些值,但是它能够接受不规则的数据,然后用一种逻辑和一致的方式来处理这些数据。
堆积图表是指图表在一个基础的系列上,堆积一个或多个系列。图表中所有 Y 值都指的是和前一个系列 Y 值的间距。当数据装载在 X 的值与数组中的完全匹配时,堆积图表是一个非常简单是事情,所有的系列都堆积得非常整齐。
C1Chart 在一般布局中为接收数据提供了更多的自由。一般布局意味着不是所有的系列都必须有完全相同的 X 值,这种自由使图表接收了一些非标准的数据,在使用堆积图表时就会遇到一些困难。
如果数据集中的第一个系列不包含和其他系列的最小的点和最大的点相匹配的点,那么堆积图表就会遇到更大的困难。
如果图表的第一个系列没有足够数量的 X 值,不能成为一个连续的系列,那么这个系列将不能像下图一样有一个明确的开始点。C1Chart 用一种逻辑的方式处理这些非规则的数据,第一个系列数据的 Y 值不存在,将作为 0 处理,然后每个连续的系列都被添加了这些数据从而产生了中断,下图就是个最好的示例。
堆积图表时如果一个连续系列的 X值和第一个系列不一致也会给推挤图表增加困难。例如,图表的第一个系列 X 值有 2,4,6 和 8,而第二个系列有值 3,4,5 和 9.图表在判断在哪个位置放置第二个系列的第一个点的时候就会遇到难题。第二系列的点的值必须添加 Y 值数据来定位点在第一个系列的头两个点之间的某处,而这个数据时数据集中没有的。
不表示数据集中的数据,C1Chart 以逻辑的方式处理这些不规则数据。根据线的走势,
C1Chart 在第一个系列的前两个点之间插入一个虚拟的点。这个插入的点的值加到第二个系列的
Y 值上从而找到堆积图表用的新的点。
使用组织好的数据作图,有时候必须在图表中标示出不可用的特殊的点。例如,你能标示出缺少的信息。一个 Data Hole 是对正在绘制的数据一个打断,用于在图表中标示出缺失的数据。
在 C1Chart 中,Hole 是指一个数据点不具有其他数据所有的显著特性,或者在一个数据组中是没有用的数据。例如,假设 Hole 的值被设定为-1000,如果一个系列的第三个点的数据不可用,一个中断或一个漏洞就会产生,绘制这个点的 Y 值到-1000.
默认的 Hole 值对 Visual Basic 来说是 Single MaxValue ,对 C#是 float MaxValue。下图是一个在 X—Y Plot 图表中数据漏洞的例子
当数组中的数据有着相同的长度,所有的数组都很一致的情况下,编程是非常简单的。即使有一些数据点丢失了,也不希望标示出这些丢失的数据。在这种情况下,还是可以使用 Data
Hole 作为丢失数据的值,C1Chart 可以很简单的完全忽略它们,就好像数据组元素完全没有
Data Hole 一样。
ChartDataSeries 的 Display 属性控制一个系列是否显示。这个属性接收一个
SeriesDisplayEnum 枚举。 如果 Display 属性设定成了 SeriesDisplayEnum.Show,那么 Data
Hole 会像上图一样排除到图表之外。 如果属性设定为 SeriesDisplayEnum.ExcludeHoles,系列会显示,但是漏洞被忽略。这就意味着如果显示的是 XY-Plot,Data Hole 前面的点和 Data Hole 后面的点直接连起来如下图所示。注意即使绘制的线穿过了 Data Hole,Data Hole 点还是没有
被画出来的。
SeriesDisplayEnum.Show
SeriesDisplayEnum.ExcludeHoles
C1Chart 有一个绘图函数的内置引擎。因为不同的应用使用不同类型的函数给,C1Char 为许多的应用提供了不同类型的函数。
提供的函数有两种类型
(polynomial), 二次函数 ( quadratic), 对数函数(logarithmic), 和指数函数(exponential)。
关于参数函数的更多信息 参照 ParametricFunction 类在 C1Chart 中,一个代码串可以用来计算 Y 函数和参数函数要使用一个代码串来计算 Y 函数和参数函数,你必须执行下面之一
C1Chart 有一个 FunctionBase 集合编辑器, 这个编辑器可以通过 C1Chart 的属性在设计时访问。FunctionBase 集合编辑器由Windows 窗口组成,可以允许用户很方便地编辑/创建函数。 使用这个编辑器,用户可以新增/删除一个过多个函数,选择函数种类(Y 函数或者参数函数)并定义代码类型和代码的语言,就能命名一些函数。关于 FunctionBase 集合编辑器的更多信息,参照 FunctionBase 集合编辑器(47 页)。
例子:说明如何创建 Y 函数和参数函数的完整实例,参照实例,FExplorer,位于 {+}http://helpcentral.componentone.com/Samples.aspx+.
当一个解释用代码串用于定义一个函数类中的一个函数(YFunction 或者
ParametricFunction),代码串被编译,编译后的代码动态地被包含到应用中。执行速度和其他编译的代码一样。
这样就有一些优点:
但是也存在一些缺点:
为了简单,使用一个变量的显式函数 YFunction 类对象.这个对象有一个code属性,
CodeText。对 YFunction 对象,单独的变量始终被假设为 X
对参数函数,必须使用 ParametricFunction 类对象定义一对方程式。这个对象有两个属性,每个坐标有一个。属性 CodeTextX 和 CodeTextY 接受编码,每个单独变量始终被假设为 t
对上面的两个类对象,单独的变量的值被假定为从最小值到最大值之间是均匀分布的,使用
PlotNumPoints 定义数据点的数量。
对于复杂的函数,使用 CodeText, CodeTextX 和 CodeTextY 提供 3 种编码类型。编码类型包括 Formula, Method 和 Unit,下面的章节逐一进行介绍。
Formula 编码类型
对应 Formula 编码类型,一个函数的 CodeText 属性必须包含使用一个参数计算函数值的
代码。代码必须写到一行并且代表方程式的右半边。
Dim yf As C1.Win.C1Chart.YFunction = New C1.Win.C1Chart.YFunction() yf.CodeType = C1.Win.C1Chart.FunctionCodeTypeEnum.Formula yf.CodeLanguage = C1.Win.C1Chart.FunctionCodeLanguageEnum.VB yf.CodeText = "x*x" yf.MinX = -5 yf.MaxX = 5 yf.LineStyle.Color = Color.Red yf.LineStyle.Thickness = 3
C1Chart1.ChartGroups(0).ChartData.FunctionsList.Add(yf)
C1.Win.C1Chart.YFunction yf = new C1.Win.C1Chart.YFunction(); yf.CodeType = C1.Win.C1Chart.FunctionCodeTypeEnum.Formula; yf.CodeText = "x*x"; yf.MinX = -5; yf.MaxX = 5; yf.LineStyle.Color = Color.Red; yf.LineStyle.Thickness = 3;
c1Chart1.ChartGroups\[0\].ChartData.FunctionsList.Add(yf); |
Method 编码类型
对于 Method 编码类型,一个函数类的 CodeText 属性必须包含方法的主体,这个方法用于
计算函数的值并且能明确地返回值。希望的返回值的类型是 Double。注意 VB 语法要求在编码
中每个声明的结尾都需要有 vbNewLines
Dim code As String = _ |
string code ="double x2 = x*x;" +
"if( x<0)" +
" return x;" +
"else" +
" return 0.5*x2;";
C1.Win.C1Chart.YFunction yf = new C1.Win.C1Chart.YFunction(); yf.CodeType = C1.Win.C1Chart.FunctionCodeTypeEnum.Method; yf.CodeText = code; yf.MinX = -5; yf.MaxX = 5; yf.LineStyle.Color = Color.Blue; yf.LineStyle.Thickness = 2;
c1Chart1.ChartGroups\[0\].ChartData.FunctionsList.Add(yf); |
Unit 编码类型
对于 Unit 编码类型,一个函数的 CodeText 属性必须包含完全编译的 Unit 文本。Unit 必须在 UserFunction namespace 中包含"Calculator"类,而且必须执行 ISimpleFunction 接口。
Visual Basic
Dim code As String = _ |
C#
string code =
|
Visual Basic
Private Sub Button_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) |
C#
private void button_Click(object sender, System.EventArgs e) {
|
使用 Calculate 方法计算函数的值作为使用 code string 或者 event 的替代方法,程序员还可以执行
C1.Win.C1Chart.ISimpleFunction 层定义一个对象实例。这个对象必须从该层继承并且实现一个公共的函数名,Calculate。这个 Calculate 方法有单独的变量(Double)作为一个参数,并且返回单独的变量(Double)。对于 YFunction 类对象,CustomFunction 属性必须被设定为 ISimpleFunction 执行对象。对于 ParametricFunction 类对象,CustomFunctionX 和 CustomFunctionY 属性必须被设定为相应对象执行的 ISimpleFunction 接口。
Visual Basic
Private Sub Button_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) |
C#
private void button_Click(object sender, System.EventArgs e) {
|
Dim tl As C1.Win.C1Chart.TrendLine = New C1.Win.C1Chart.TrendLine() tl.SeriesIndex = 0 tl.LineStyle.Color = Color.Red tl.LineStyle.Thickness = 2 tl.Text = "{#FORMULA}"
c1Chart1.ChartGroups(0).ChartData.TrendsList.Add(tl)
C1.Win.C1Chart.TrendLine tl = new C1.Win.C1Chart.TrendLine(); tl.SeriesIndex = 0; tl.LineStyle.Color = Color.Red; tl.LineStyle.Thickness = 2; tl.Text = "{#FORMULA}";
c1Chart1.ChartGroups\[0\].ChartData.TrendsList.Add( tl); |
图例如下红色的先连接了第一个和最后一个数据点。
回归趋势线有两个相关的类对象,分别为 RegressionOptions 和 RegressionStatistics.这些对象描述了趋势线所希望的形式,通过统计合计结果趋势线。
回归选项
RegressionOption 对象允许回归模型的规范。NumTerms 属性定义一个回归所需要的系数的个数,和回归有关的仅是项的不等的个数(多项式和傅里叶)。
对于一个多项式回归,项的个数要比由此产生的多项式的阶多一。一个多项式的最多的项数
是数据点的数量,最小的项数是二(直线)
下面的图表示了一个直线的回归(由于有 2 个项)
下面的图表示一个多项式回归(项数超过 2)
UseYIntercept 属性控制多项式回归的第一个项数是否是固定的,当 UseYIntercept 是True,趋势线截取 Yintercept 属性定义的点作为Y轴上X=0的点下图描述了 UseYIntercept 属性是 False 时的一个非固定的直线回归线
下图表示了一个固定的直线回归,因为趋势线设定为截取 RegressionOptions.Yintercept 属性定义的在 Y 坐标上 X=0 的线。
回归统计
RegressionStatistics属性返回了一个包含回归模型的统计结果的RegressionStatistics对象。当趋势线不是回归的或者现在的数据不能解决回归,RegressionStatistics 属性返回 Nothing(VB)
或者空(C#)。
下面的表定义了统计方程式所需要的值。值 定义
n 点的个数
nt 回归系数的个数
下面的表表示 RegressionStatistics 对象的名称,描述和语法。
名称 | 描述 | 公式 | 公式(UseYIntercept=true) |
Ssr | 平方和取决于回归统计 | 错误!对象不能从编辑域代码中不能被创建。 | 错误!对象不能从编辑域代码中不能被创建。 |
Sse | 平方和取决于错误 | 错误!对象不能从编辑域代码中不能被创建。 | 错误!对象不能从编辑域代码中不能被创建。 |
Rsq | 确定系数 | 错误!对象不能从编辑域代码中不能被创建。 | 错误!对象不能从编辑域代码中不能被创建。 |
DF | 自由度数 | 错误!对象不能从编辑域代码中不能被创建。 | 错误!对象不能从编辑域代码中不能被创建。 |
F | F 值(F 统计) | 错误!对象不能从编辑域代码中不能被创建。 | 错误!对象不能从编辑域代码中不能被创建。 |
实现一个自定义的趋势线,一个类必须实现创建 ICustomTrendLine 接口。这个类的实例被分配给一个 TrendLine 对象的 CustomTrendLine 属性。这种情况下趋势线的所有的点都必须由类完全定义,并且 TrendLineType 属性的设定是不重要的。下面的示例编码实现了一个和数据
范围同步的自定义趋势线。
C#
private void button1_Click(object sender, System.EventArgs e) {
|
上面的内容做出下面的图表 围绕着数据点创建了一个自定义的红色的虚线的趋势线。
Dim styles As C1.Win.C1Chart.PointStylesCollection = _ c1Chart1.ChartGroups(0).ChartData.PointStylesList
Dim psmin As C1.Win.C1Chart.PointStyle = styles.AddNewPointStyle() psmin.LineStyle.Pattern = C1.Win.C1Chart.LinePatternEnum.None psmin.SymbolStyle.Color = Color.MistyRose psmin.SymbolStyle.OutlineColor = Color.Blue psmin.SymbolStyle.OutlineWidth = 2 psmin.SymbolStyle.Size = 10 psmin.Selection = C1.Win.C1Chart.PointStyleSelectionEnum.SeriesMinY psmin.Label = "Y Min" psmin.LegendEntry = True
Dim psmax As C1.Win.C1Chart.PointStyle = styles.AddNewPointStyle() psmax.LineStyle.Pattern = C1.Win.C1Chart.LinePatternEnum.None psmax.SymbolStyle.Color = Color.MistyRose psmax.SymbolStyle.OutlineColor = Color.Red psmax.SymbolStyle.OutlineWidth = 2 psmax.SymbolStyle.Size = 10 psmax.Selection = C1.Win.C1Chart.PointStyleSelectionEnum.SeriesMaxY psmax.Label = "Y Max" psmax.LegendEntry = True c1Chart1.Legend.Visible = True
C#
|
PointStyles 添加到了 C1Chart 的第一个系列的数据点。还添加了两个特殊点的类型表示 Y 轴的最小值的点和最大值的点。
Visual Basic
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)_ |
C#
private void button1_Click(object sender, System.EventArgs e) {
|
Y 值小于 0 定制了蓝色的点类型,y 值大于 0 定制了红色的点类型。