ZedGraph用图表线顺利移动Y2Axis

时间:2012-04-19 06:33:26

标签: c# customization zedgraph

在我的问题"ZedGraph custom graph"中,我有每秒插入数据的图表,现在我有其他问题:

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

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

  3. 感谢您的帮助!

    UPD1 : 谢谢kmp!我尝试你的代码 - 它很好但有问题:当我开始时我看到了这个: enter image description here 几分钟后我看到这张照片: enter image description here

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

    UPD2 : 还有一个问题 - Y2Axis的标签没有固定值。例如现在: enter image description here

    几秒钟后: enter image description here

1 个答案:

答案 0 :(得分:3)

从最简单的开始 - 格式化标签可以这样完成:

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

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

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

private Queue<DateTime> 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<DateTime>();

    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;
}