Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ZedGraph使用图表线平滑移动Y轴_C#_Customization_Zedgraph - Fatal编程技术网

C# ZedGraph使用图表线平滑移动Y轴

C# ZedGraph使用图表线平滑移动Y轴,c#,customization,zedgraph,C#,Customization,Zedgraph,在下面的问题中,我有一张每秒钟插入一次数据的图表,现在我还有其他问题: 如何使用图表线沿Y轴(日期时间类型)平滑移动,并在图表中始终仅显示30分钟 如何格式化Y2Axis标签“HH:mm”以获得10:05、10:10、10:15、…、10:30 谢谢你的帮助 UPD1: 谢谢kmp!我尝试了你的代码-它很好,但有一个问题:当我开始时,我看到: 几分钟后,我看到这张照片: 我有一个“压缩”的图表区域,但我想静态显示始终持续30分钟,并缓慢向下移动旧数据,而不缩放或“打包”图表与轴。我希望你能理解

在下面的问题中,我有一张每秒钟插入一次数据的图表,现在我还有其他问题:

  • 如何使用图表线沿Y轴(日期时间类型)平滑移动,并在图表中始终仅显示30分钟

  • 如何格式化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<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;
    }
    
    私有队列时间;
    私有静态只读随机rnd=new Random();
    私有无效按钮1\u单击(对象发送者,事件参数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”,
    新的PointPairList(),
    颜色,红色,
    SymbolType.None);
    myCurve.Symbol.Fill=新填充(颜色为白色);
    myCurve.IsX2Axis=真;
    myCurve.IsY2Axis=真;
    myPane.Chart.Fill=新填充(Color.White,Color.LightGray,45.0f);
    zg1.IsShowPointValues=真;
    AxistTimes=新队列();
    var t=new System.Windows.Forms.Timer();
    t、 间隔=1000;
    t、 勾号+=显示数据;
    睡眠(100);
    t、 Start();
    }
    私有void ShowData(对象发送方、事件参数)
    {
    var t=(System.Windows.Forms.Timer)发送方;
    t、 启用=错误;
    INTX=下一个rnd(500600);
    var y=新的XDate(DateTime.Now);
    var myCurve=zg1.GraphPane.CurveList[0];
    if(axisTimes.Any())
    {             
    //删除任何超出时间阈值的点
    而(((DateTime)y)-axisTimes.Peek()).TotalMinutes>30)
    {
    myCurve.RemovePoint(0);
    axisTimes.Dequeue();
    如果(!axisTimes.Any())
    {
    打破
    }
    }
    }
    //添加新点并存储添加该点的日期时间
    //我们自己的队伍
    排队(y);
    myCurve.AddPoint(x,y);
    zg1.AxisChange();
    zg1.Invalidate();
    t、 启用=真;
    }
    
    该轴仅显示约5分钟的数据-在显示30分钟之前它不会“移动”-将代码中的TotalMinutes值调整为2,以了解我的意思。如果我理解您的意思,此代码会将图表(轴和线)压缩到30分钟,30分钟后将“滚动”图表?是,这是正确的-它将只显示最后30分钟的数据,并放弃任何其他内容。但我希望最初显示30分钟,而不显示compess图表,直到30分钟发生。我有更新问题。如何在Y轴上创建固定标签值?现在,当每1秒插入一次新数据时,轴标签总是会更改,但我希望15:45:00、15:50:00、15:55:00。。。很抱歉,这超出了我使用ZedGraph的能力-希望其他人能帮助你。