在给定 y 截距和斜率的情况下在图表中绘制一条线
Plotting a line in a chart given the y intercept and slope
我编写了一个程序,根据用户的多个输入值计算最佳拟合线 (intercept/slope)。我已经绘制了每个单独的值,但是不确定 绘制直线 给定斜率和 y 截距的代码。
这是坡度:
double m = ( aXY.Sum() -
((levels.Sum() * scores.Sum()) / 5)) / (newaX.Sum() - ((powLevels) / 5));
拦截
double b = meanY - (m * meanX);
绘制点
for (int i = 0; i < levels.GetLength(0); i++)
{
chart1.Series["Series1"].Points
.AddXY(levels.GetValue(i), scores.ToArray().GetValue(i));
}
有什么想法吗?我绝不是专家,要做到这一点需要进行一些试验..
假设您的数据使用 ChartType.Points
绘制为散点图,添加线条的最简单方法是添加一个 extra Series
和 ChartType.Line
并在那里设置两个点。
有 种其他方法可以在 Chart
上创建线条,例如绘制或创建 LineAnnotation
,但它们是 多更复杂!
紧接着this example 这里是一个实现:
请注意,在为 最适合的行 创建系列后,您正在寻找的只是 最后两行 。 .:
private void button1_Click(object sender, EventArgs e)
{
// create TWO series!
chart1.Series.Clear();
chart1.Series.Add("Data");
chart1.Series.Add("Line of best fit");
chart1.Series[0].ChartType = SeriesChartType.Point;
chart1.Series[1].ChartType = SeriesChartType.Line;
List<int> levels = new List<int>() { 8, 2, 11, 6, 5, 4, 12, 9, 6, 1};
List<int> scores = new List<int>() { 3, 10, 3, 6, 8, 12, 1, 4, 9, 14};
double minX = levels.ToList().Min();
double maxX = levels.ToList().Max();
double meanX = 1f * levels.Sum() / levels.Count;
double meanY = 1f * scores.Sum() / scores.Count;
double st = 0;
double sb = 0;
for (int i = 0; i < levels.Count; i++ )
{
st += (levels[i] - meanX) * (scores[i] - meanY);
sb += (levels[i] - meanX) * (levels[i] - meanX);
}
double slope = st / sb;
double y0 = meanY - slope * meanX; // y-intercept or y-crossing
for (int i = 0; i < levels.Count; i++)
{
chart1.Series[0].Points.AddXY(levels[i], scores[i]);
}
// this is the part that creates the line of best fit:
chart1.Series[1].Points.AddXY(minX, y0 + minX * slope);
chart1.Series[1].Points.AddXY(maxX, y0 + maxX * slope);
}
如果您愿意,可以在 y-axis:
处添加第一行点
chart1.Series[1].Points.AddXY(0, y0 );
在这种情况下,您可能需要设置图表中显示的最小值 x-values 以防止它包含 -1
,可能像这样:
chart1.ChartAreas[0].AxisX.Minimum = minX - 1;
我编写了一个程序,根据用户的多个输入值计算最佳拟合线 (intercept/slope)。我已经绘制了每个单独的值,但是不确定 绘制直线 给定斜率和 y 截距的代码。
这是坡度:
double m = ( aXY.Sum() -
((levels.Sum() * scores.Sum()) / 5)) / (newaX.Sum() - ((powLevels) / 5));
拦截
double b = meanY - (m * meanX);
绘制点
for (int i = 0; i < levels.GetLength(0); i++)
{
chart1.Series["Series1"].Points
.AddXY(levels.GetValue(i), scores.ToArray().GetValue(i));
}
有什么想法吗?我绝不是专家,要做到这一点需要进行一些试验..
假设您的数据使用 ChartType.Points
绘制为散点图,添加线条的最简单方法是添加一个 extra Series
和 ChartType.Line
并在那里设置两个点。
有 种其他方法可以在 Chart
上创建线条,例如绘制或创建 LineAnnotation
,但它们是 多更复杂!
紧接着this example 这里是一个实现:
请注意,在为 最适合的行 创建系列后,您正在寻找的只是 最后两行 。 .:
private void button1_Click(object sender, EventArgs e)
{
// create TWO series!
chart1.Series.Clear();
chart1.Series.Add("Data");
chart1.Series.Add("Line of best fit");
chart1.Series[0].ChartType = SeriesChartType.Point;
chart1.Series[1].ChartType = SeriesChartType.Line;
List<int> levels = new List<int>() { 8, 2, 11, 6, 5, 4, 12, 9, 6, 1};
List<int> scores = new List<int>() { 3, 10, 3, 6, 8, 12, 1, 4, 9, 14};
double minX = levels.ToList().Min();
double maxX = levels.ToList().Max();
double meanX = 1f * levels.Sum() / levels.Count;
double meanY = 1f * scores.Sum() / scores.Count;
double st = 0;
double sb = 0;
for (int i = 0; i < levels.Count; i++ )
{
st += (levels[i] - meanX) * (scores[i] - meanY);
sb += (levels[i] - meanX) * (levels[i] - meanX);
}
double slope = st / sb;
double y0 = meanY - slope * meanX; // y-intercept or y-crossing
for (int i = 0; i < levels.Count; i++)
{
chart1.Series[0].Points.AddXY(levels[i], scores[i]);
}
// this is the part that creates the line of best fit:
chart1.Series[1].Points.AddXY(minX, y0 + minX * slope);
chart1.Series[1].Points.AddXY(maxX, y0 + maxX * slope);
}
如果您愿意,可以在 y-axis:
处添加第一行点 chart1.Series[1].Points.AddXY(0, y0 );
在这种情况下,您可能需要设置图表中显示的最小值 x-values 以防止它包含 -1
,可能像这样:
chart1.ChartAreas[0].AxisX.Minimum = minX - 1;