首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何治愈C# winforms曲线图的摇摆?

如何治愈C# winforms曲线图的摇摆?
EN

Stack Overflow用户
提问于 2016-03-01 21:02:20
回答 3查看 616关注 0票数 12

我正在一个C# WPF应用程序中实现一些实时图表,但我使用的是WinForms图表,因为它们通常很容易处理,而且性能出奇地好。

不管怎么说,我已经把图表做得很好了,除了一个我一辈子都搞不懂的重大问题:

当我将数据添加到图表中时,它有时只是调整自身大小。有时候,它做了很多这样的事情,让自己摇摆,让图表变得非常烦人,让人难以阅读和处理。

,我的问题是:我如何才能防止这个该死的图表不断调整自身大小?!

一些补充资料:

图表包括在我的XAML中,如下所示:

代码语言:javascript
复制
<WindowsFormsHost Grid.Row="1" Grid.ColumnSpan="2" Margin="5">
  <winformchart:Chart Dock="Fill" x:Name="Session0Chart">
    <winformchart:Chart.ChartAreas>
      <winformchart:ChartArea/>
    </winformchart:Chart.ChartAreas>
  </winformchart:Chart>
</WindowsFormsHost>

获取通过以下方法初始化的:

代码语言:javascript
复制
// initialize it!
chart.Palette = ChartColorPalette.Bright;

// setup the labels
Font monoSpaceFont = new Font("Consolas", 10);
chart.ChartAreas[0].AxisX.LabelStyle.Font = monoSpaceFont;
chart.ChartAreas[0].AxisY.LabelStyle.Font = monoSpaceFont;

// set the axis limits appropriately
chart.ChartAreas[0].AxisY.Maximum = 600;
chart.ChartAreas[0].AxisY.Minimum = -200;

// set up grid lines and axis styles
chart.ChartAreas[0].AxisX.MinorGrid.Enabled = true;
chart.ChartAreas[0].AxisX.MinorGrid.LineDashStyle = ChartDashStyle.Dash;
chart.ChartAreas[0].AxisX.MinorGrid.LineColor = System.Drawing.Color.Gray;
chart.ChartAreas[0].AxisX.MinorGrid.Interval = 0.04;
chart.ChartAreas[0].AxisX.LabelStyle.Format = "F2";
chart.ChartAreas[0].AxisX.LabelAutoFitStyle = LabelAutoFitStyles.None;

chart.ChartAreas[0].AxisY.MajorGrid.Enabled = true;
chart.ChartAreas[0].AxisY.MajorGrid.LineDashStyle = ChartDashStyle.Solid;
chart.ChartAreas[0].AxisY.MajorGrid.Interval = 200;
chart.ChartAreas[0].AxisY.LabelAutoFitStyle = LabelAutoFitStyles.None;
chart.ChartAreas[0].AxisY.LabelStyle.Format = "F0";

chart.Series.Clear();

Series s = new Series();
s.ChartType = SeriesChartType.FastLine;
chart.Series.Add(s);
chart.Refresh();

并通过以下方式添加数据点:

代码语言:javascript
复制
// if we get too many points, remove the head
if (session.Chart.Series[0].Points.Count >= Properties.Settings.Default.ECGDataPoints)
{
    session.Chart.Series[0].Points.RemoveAt(0);
}

// add the points
for (int i = data.samples.Length - 1; i >= 0; i--)
{
    session.Chart.Series[0].Points.AddXY(session.ecgT, data.samples[i]);
    session.ecgT += session.ECGPeriod / (double)data.samples.Length;
}

// only look at the last few seconds
session.Chart.ChartAreas[0].AxisX.Maximum = session.ecgT;
session.Chart.ChartAreas[0].AxisX.Minimum = session.ecgT - Properties.Settings.Default.ECGTimeWindow;

您所能提供的任何帮助都将是非常感谢的,这已经让我疯狂了太久了!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-03-02 16:56:32

你应该让你的X轴DateTime,而不是double。反正是心电图..。摆动是由使用诸如0.10000000001234之类的值递增X轴引起的。

代码语言:javascript
复制
// No wiggle
        chartNoWiggle.Series[0].Points.AddXY(xdatetime, r.NextDouble());

        if (chartNoWiggle.Series[0].Points.Count > 10)
            chartNoWiggle.Series[0].Points.RemoveAt(0);

        chartNoWiggle.ChartAreas[0].AxisX.Minimum = chartNoWiggle.Series[0].Points[0].XValue;
        chartNoWiggle.ChartAreas[0].AxisX.Maximum = xdatetime.ToOADate();

        xdatetime = xdatetime.AddMinutes(1);

// Wiggle
        chartWiggle.Series[0].Points.AddXY(xdouble, r.NextDouble());

        if (chartWiggle.Series[0].Points.Count > 10)
            chartWiggle.Series[0].Points.RemoveAt(0);

        chartWiggle.ChartAreas[0].AxisX.Minimum = chartWiggle.Series[0].Points[0].XValue;
        chartWiggle.ChartAreas[0].AxisX.Maximum = xdouble;

        xdouble += 0.10000000001234;
票数 7
EN

Stack Overflow用户

发布于 2016-03-02 10:46:21

代码语言:javascript
复制
chart.ChartAreas[0].InnerPlotPosition.X = 50;
chart.ChartAreas[0].InnerPlotPosition.Y = 5;
chart.ChartAreas[0].InnerPlotPosition.Width = 80;
chart.ChartAreas[0].InnerPlotPosition.Height = 80;

票数 2
EN

Stack Overflow用户

发布于 2016-03-02 11:23:05

您可以设置ChartArea、PositionInnerPlotPosition以避免这些抖动。

代码语言:javascript
复制
chrt.ChartAreas[0].Position.Auto = false;
chrt.ChartAreas[0].Position.Height = 70;
chrt.ChartAreas[0].Position.Y = 5;

chrt.ChartAreas[0].InnerPlotPosition.Auto = false;
chrt.ChartAreas[0].InnerPlotPosition.Height = 50;
chrt.ChartAreas[0].InnerPlotPosition.Y = 10;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35733426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档