我正在使用National Instrument进行数据采集并在图表上显示收集的数据。但是,当我放大曲线时曲线有一个尖锐的尖端,如图所示:
我使用以下代码获取此图表:
private void timer9_Tick(object sender, EventArgs e)
{
Task analogInTask1 = new Task();
AIChannel myAIChannel1;
myAIChannel1 = analogInTask1.AIChannels.CreateVoltageChannel(
"dev1/AI1",
"myAIChannel1",
AITerminalConfiguration.Rse,
0,
5,
AIVoltageUnits.Volts
);
AnalogSingleChannelReader reader1 = new AnalogSingleChannelReader(analogInTask1.Stream);
double analogDataIn1 = reader1.ReadSingleSample();
tension1Reading.Text = analogDataIn1.ToString("f2");
DataPoint dp0 = new DataPoint(x, analogDataIn1);
chart2.Series[0].Points.RemoveAt(0);
chart2.Series[0].Points.Add(dp0);
x++;
if (checkBox1.Checked == true)
chart2.Series["Series1"].Enabled = true;
else
chart2.Series["Series1"].Enabled = false;
}
我正在使用张力传感器来收集数据,以便我可以在图表上显示它们。是x轴的问题与y轴不匹配。因为我使用[x ++;]来计算x轴,而我使用模拟数据输入来获得Y轴。我怎样才能得到直线或平滑线?
答案 0 :(得分:3)
你试过移动平均线吗?这可以根据您的需要量身定制,并且看起来很平滑"出图。这是一个非常简单的如何修改代码的示例。
// get the last 4 points to average out (plus analogDataIn1)
int pointsToAverage = 4;
int pointCount = chart2.Series[0].Points.Count();
var buffer = chart2.Series[0].Points.Skip(Math.Max(0, pointCount - pointsToAverage)).Select(dp => dp.YValues[0]);
// calculate the average Y from these points (along with analogDataIn1)
double avgAnalogDataIn1;
if (buffer.Count() == 0)
{
avgAnalogDataIn1 = analogDataIn1;
}
else
{
avgAnalogDataIn1 = (buffer.Sum() + analogDataIn1) / (double)(buffer.Count() + 1);
}
DataPoint dp0 = new DataPoint(x, avgAnalogDataIn1);
chart2.Series[0].Points.RemoveAt(0);
chart2.Series[0].Points.Add(dp0);
x++;
此示例使用5个点进行平均值。您可以通过将pointsToAverage
提升到10
来快速增加平均点数,这样可以使图表更加平滑。请注意,这些线仍然会有尖锐的提示' - 没有ChartType
为你平滑线条。
答案 1 :(得分:1)
作为Balah答案的变体:
要创建移动平均线,您只需使用功能强大的built-in statistical functions之一:
chart1.DataManipulator.FinancialFormula(FinancialFormula.MovingAverage,
"15", "S1:Y1", "S2:Y");
这会使Series S1
平滑 15分并将结果绘制为Series S2
:
请注意,找到合适的范围来进行平均值取决于您的数据和要求。在我的示例中,当范围跨越其中一个间隙时,会创建工件。