ZedGraph用图表线顺利移动Y2Axis

在我的问题“ZedGraph自定义图表”中,我有每秒插入数据的图表,现在我有其他问题:

  1. 如何使用图表线顺利向下移动Y2Axis(日期时间类型)并在图表中显示始终只持续30分钟?

  2. 如何格式化Y2Axis标签“HH:mm”得到10:05,10:10,10:15,…,10:30?

感谢帮助!

UPD1 :谢谢kmp! 我尝试你的代码 – 它很好但有问题:当我开始时我看到了这个: 在此处输入图像描述 几分钟后我看到这张照片: 在此处输入图像描述

我有一个图表区域的“压缩”,但我想静态显示总是持续30分钟并慢慢向下移动旧数据,而不是缩放或“打包”带有轴的图表。 我希望你能理解我。

UPD2 :另一个问题 – Y2Axis的标签没有固定值。 例如现在: 在此处输入图像描述

几秒钟后: 在此处输入图像描述

从最简单的开始 – 格式化标签可以这样做:

myPane.Y2Axis.Scale.Format = "HH:mm"; 

你可以做到这一点的一种方法(它感觉有点片状,但我会让你决定)只是一旦超过你的阈值(在这种情况下超过30分钟)就从曲线中删除点。 这样,当图表重绘轴时将相应地更新。

我觉得使用scale min值可能是一种比这更好的方法,但是如果没有你可以简单地维护一个队列,就像你添加这样的点,然后当它们超出你的阈值时删除它们:

 private Queue axisTimes; private static readonly Random rnd = new Random(); private void button1_Click(object sender, EventArgs e) { GraphPane myPane = zg1.GraphPane; myPane.XAxis.IsVisible = false; myPane.X2Axis.IsVisible = true; myPane.X2Axis.MajorGrid.IsVisible = true; myPane.X2Axis.Scale.Min = 0; myPane.X2Axis.Scale.Max = 600; myPane.YAxis.IsVisible = false; myPane.Y2Axis.IsVisible = true; myPane.Y2Axis.Scale.MajorUnit = DateUnit.Minute; myPane.Y2Axis.Scale.MinorUnit = DateUnit.Second; myPane.Y2Axis.Scale.Format = "HH:mm"; myPane.Y2Axis.Type = AxisType.DateAsOrdinal; LineItem myCurve = myPane.AddCurve("Alpha", new PointPairList(), Color.Red, SymbolType.None); myCurve.Symbol.Fill = new Fill(Color.White); myCurve.IsX2Axis = true; myCurve.IsY2Axis = true; myPane.Chart.Fill = new Fill(Color.White, Color.LightGray, 45.0f); zg1.IsShowPointValues = true; axisTimes = new Queue(); var t = new System.Windows.Forms.Timer(); t.Interval = 1000; t.Tick += ShowData; Thread.Sleep(100); t.Start(); } private void ShowData(object sender, EventArgs e) { var t = (System.Windows.Forms.Timer) sender; t.Enabled = false; int x = rnd.Next(500, 600); var y = new XDate(DateTime.Now); var myCurve = zg1.GraphPane.CurveList[0]; if (axisTimes.Any()) { // Remove any points that go beyond our time threshold while ((((DateTime)y) - axisTimes.Peek()).TotalMinutes > 30) { myCurve.RemovePoint(0); axisTimes.Dequeue(); if (!axisTimes.Any()) { break; } } } // Add the new point and store the datetime that it was added in // our own queue axisTimes.Enqueue(y); myCurve.AddPoint(x, y); zg1.AxisChange(); zg1.Invalidate(); t.Enabled = true; }