【问题标题】:ZedGraph smoothly move Y2Axis with chart lineZedGraph 用图表线平滑移动 Y2Axis
【发布时间】:2012-04-19 06:33:26
【问题描述】:

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

  1. 如何用图表线平滑地向下移动 Y2Axis(DateTime 类型)并在图表中始终显示仅持续 30 分钟?

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

感谢您的帮助!

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

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

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

几秒钟后:

【问题讨论】:

  • 该轴仅显示大约 5 分钟的数据 - 在显示 30 分钟之前它不会“移动” - 将代码中的 TotalMinutes 值调整为 2,以了解我的意思。

标签: c# customization zedgraph


【解决方案1】:

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

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

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

我觉得采用比例最小值可能是比这更好的方法,但是如果您无法像这样添加点时简单地维护一个队列,然后在它们超出您的阈值时将它们删除:

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

【讨论】:

  • 如果我理解你,这段代码会压缩图表(轴和线)直到 30 分钟发生,30 分钟后将“滚动”图表?
  • 是的,没错——它只会显示最近 30 分钟的数据,并丢弃其他任何数据。
  • 但我想最初显示 30 分钟没有压缩图表,直到 30 分钟发生。
  • 我有更新问题。如何在 Y2Axis 上制作固定标签值?现在,当每 1 秒插入新数据时,轴标签总是会发生变化,但我想要 15:45:00, 15:50:00, 15:55:00, ... 标签。
  • 很抱歉,这超出了我对 ZedGraph 的技能范围 - 希望其他人可以帮助您。
猜你喜欢
  • 1970-01-01
  • 2021-12-20
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 2011-05-26
  • 1970-01-01
  • 2017-11-07
  • 1970-01-01
相关资源
最近更新 更多