zedGraph画多个图表

起初是想到用多个zedGraph做。然后实际做的时候 zedGraph的同步一直做的不好。尤其当采样速度很快的时候很难保持好。甚至会出现界面假死和卡死的现象。

因此想用其他解决方法:

查看资料后 发现了zedGraph的MasterPane: 它允许一个zedGraph控件 绘制多张Graphpane。并且只要zedGraphControl1.IsSynchronizeXAxes = true;就能实现两张Graphpane的轴同步。因此只需控制一个zedGraph就好。高效方便许多。

实验代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using OfficeOpenXml;
using OfficeOpenXml.Drawing;
using OfficeOpenXml.Drawing.Chart;
using OfficeOpenXml.Style;
using System.IO;
using ZedGraph;
using System.Threading;

namespace WindowsFormsApplication5
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        int count = 0;
        private void timer1_Tick(object sender, EventArgs e)
        {

            //zedGraphControl1.GraphPane.XAxis.Scale.MaxAuto = true;

            itime++;
            this.zedGraphControl1.AxisChange();
            this.zedGraphControl1.Refresh();
            this.zedGraphControl2.AxisChange();
            this.zedGraphControl2.Refresh();
            //if (list1 != null)
            //{
            //    if (itime >= 100)
            //    {
            //        zedGraphControl1.GraphPane.XAxis.Scale.Min = (double)itime - 100;
            //        zedGraphControl1.GraphPane.XAxis.Scale.Max = (double)itime;
            //        RefreshGraph(zedGraphControl1);
            //        //zedGraphControl2.GraphPane.XAxis.Scale.Min = (double)itime - 100;
            //        //zedGraphControl2.GraphPane.XAxis.Scale.Max = (double)itime;
            //        //RefreshGraph(zedGraphControl2);
            //    }
            //}
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            initZedGraph(zedGraphControl1);
            Task task = new Task(new Action(sampling));
            task.Start();
        }
        private PointPairList list1 = new PointPairList();  //AD1的点
        private PointPairList list2 = new PointPairList();  //AD2的点
        private PointPairList list3 = new PointPairList();
        private PointPairList list4 = new PointPairList();  //AD1的点
        private PointPairList list5 = new PointPairList();  //AD2的点
        private PointPairList list6 = new PointPairList();

        private PointPairList list7 = new PointPairList();  //AD1的点
        private PointPairList list8= new PointPairList();  //AD2的点
        private PointPairList list9 = new PointPairList();

        private void initZedGraph(ZedGraphControl zedgraph)
        {
            MasterPane master = zedgraph.MasterPane;
            master.Fill = new Fill(Color.White, Color.FromArgb(220, 220, 255), 45.0f);
            master.PaneList.Clear();
            master.Title.IsVisible = true;
            master.Title.Text = "测头调试曲线图";
            master.Margin.All = 10;
            master.InnerPaneGap = 0;
            ColorSymbolRotator rotator = new ColorSymbolRotator();
            for (int j = 0; j < 2; j++)
            {
                GraphPane myPaneT = new GraphPane(new Rectangle(40, 40, 250, 500),
                    "Case #" + (j + 1).ToString(),
                    "时间",
                    "电压");
                //GraphPane myPaneT = new GraphPane(new Rectangle(40, 40, 500, 250),
                //    "Case #" + (j + 1).ToString(),
                //    "时间",
                //    "电压");
                myPaneT.Fill.IsVisible = false;
                myPaneT.Chart.Fill = new Fill(Color.White, Color.SteelBlue, 45.0F);
                myPaneT.BaseDimension = 2.0F;
                myPaneT.XAxis.Title.IsVisible = false;
                myPaneT.XAxis.Scale.IsVisible = false;
                myPaneT.Legend.IsVisible = false;
                myPaneT.Border.IsVisible = false;
                myPaneT.Title.IsVisible = false;

                myPaneT.XAxis.MajorTic.IsOpposite = false;
                myPaneT.XAxis.MinorTic.IsOpposite = false;
                myPaneT.XAxis.MajorTic.IsOutside = false;
                myPaneT.XAxis.MinorTic.IsOutside = false;
                myPaneT.XAxis.MajorGrid.IsVisible = true;
                myPaneT.XAxis.MinorGrid.IsVisible = true;
                myPaneT.XAxis.Scale.Max = 100;
                myPaneT.XAxis.Scale.Min = 0;

                myPaneT.YAxis.Title.Text = "距离(μm)";
                myPaneT.YAxis.Title.FontSpec.Size = 5;
                myPaneT.YAxis.Scale.Max = 3500;
                myPaneT.YAxis.Scale.Min = -3500;
                myPaneT.YAxis.Scale.MajorStep = 1000;
                myPaneT.YAxis.MajorTic.IsOpposite = false;
                myPaneT.YAxis.MinorTic.IsOpposite = false; //小刻度
                myPaneT.YAxis.Scale.Align = AlignP.Inside;

                myPaneT.Y2Axis.Title.Text = "电压值";
                myPaneT.Y2Axis.Title.FontSpec.Size = 5;
                myPaneT.Y2Axis.Scale.Max = 4;
                myPaneT.Y2Axis.Scale.Min = -4;
                myPaneT.Y2Axis.Scale.MajorStep = 1;
                myPaneT.Y2Axis.Scale.FontSpec.FontColor = Color.Black;
                myPaneT.Y2Axis.Title.FontSpec.FontColor = Color.Black;
                myPaneT.Y2Axis.MajorTic.IsOpposite = false;
                myPaneT.Y2Axis.MinorTic.IsOpposite = false;
                myPaneT.Y2Axis.Scale.Align = AlignP.Inside;
                myPaneT.Y2Axis.IsVisible = true;
                myPaneT.Margin.All = 1;       // Graphpane之间的间隔边缘距离

                myPaneT.YAxis.Scale.FontSpec.Size = 4;
                myPaneT.Y2Axis.Scale.FontSpec.Size = 4;
                if (j == 0)
                {
                    myPaneT.Title.Text = "上测头";
                    LineItem Curve1 = myPaneT.AddCurve("电压1", list1, Color.Yellow, SymbolType.None);
                    LineItem Curve2 = myPaneT.AddCurve("电压2", list2, Color.Green, SymbolType.None);
                    LineItem Curve3 = myPaneT.AddCurve("电压3", list3, Color.Red, SymbolType.None);
                    Curve1.IsY2Axis = true;
                    Curve2.IsY2Axis = true;

                }
                if (j == 1)
                {
                    myPaneT.Title.Text = "下测头";
                    LineItem Curve1 = myPaneT.AddCurve("电压1", list4, Color.Yellow, SymbolType.None);
                    LineItem Curve2 = myPaneT.AddCurve("电压2", list5, Color.Green, SymbolType.None);
                    LineItem Curve3 = myPaneT.AddCurve("电压3", list6, Color.Red, SymbolType.None);
                    Curve1.IsY2Axis = true;
                    Curve2.IsY2Axis = true;

                }

                master.Add(myPaneT);
               // zedgraph.MasterPane[0].Chart.Rect = new RectangleF(100, 100, 200, 200);
                zedgraph.AxisChange();
                if (j > 0)
                {
                    myPaneT.YAxis.Scale.IsSkipLastLabel = true;
                    myPaneT.YAxis.Scale.IsSkipLastLabel = true;
                    myPaneT.YAxis.MinSpace = 10;
                    myPaneT.Y2Axis.MinSpace = 10;

                }
            }
            using (Graphics g = zedgraph.CreateGraphics())
            {
                ZedGraphControl z1 = zedgraph;

                master.SetLayout(g, PaneLayout.SingleColumn);
                z1.AxisChange();
                z1.IsAutoScrollRange = true;
                z1.IsShowHScrollBar = true;
                z1.IsShowVScrollBar = true;
                z1.IsSynchronizeXAxes = true;
            }
        }
        long itime = 0;
        private void sampling()
        {

            while (true)
            {
                Random rd = new Random();  

                //list1.Add((double)itime, rd.Next(1, 4));
                //list2.Add((double)itime, rd.Next(1, 4));
                //list4.Add((double)itime, rd.Next(1, 4));
                //list5.Add((double)itime, rd.Next(1, 4));
                //list3.Add((double)itime, rd.Next(1, 4000));
                //list6.Add((double)itime, rd.Next(1, 4000));

                //if (itime%1000000==0)
                //{
                    list1.Add((double)itime, rd.Next(1, 4));
                    list2.Add((double)itime, rd.Next(1, 4));
                    list4.Add((double)itime, rd.Next(1, 4));
                    list5.Add((double)itime, rd.Next(1, 4));
                    list3.Add((double)itime, rd.Next(1, 4000));
                    list6.Add((double)itime, rd.Next(1, 4000));
                itime++;
                if (itime > 10000)
                {
                    itime = 0;
                    list1.Clear();
                    list2.Clear();
                    list4.Clear();
                    list5.Clear();
                    list3.Clear();
                    list6.Clear();
                }

                if (itime >= 100)
                {
                    Thread.Sleep(1);

                    zedGraphControl1.MasterPane[0].XAxis.Scale.Min = (double)itime - 100;
                    zedGraphControl1.MasterPane[0].XAxis.Scale.Max = (double)itime;
                    zedGraphControl1.MasterPane[1].XAxis.Scale.Min = (double)itime - 100;
                    zedGraphControl1.MasterPane[1].XAxis.Scale.Max = (double)itime;
                    RefreshGraph(zedGraphControl1);
                }

            }
        }
        private delegate void RefreshDelegate();
        private void RefreshGraph(ZedGraphControl zg)
        {
            if (zg == null)
                return;
            //判断是否是非创建控件的线程调用控件
            if (zg.InvokeRequired)
            {
                RefreshDelegate a = new RefreshDelegate(new Action(() => { zg.Invalidate();  }));
                zg.BeginInvoke(a);
            }
            else
            {
                zg.AxisChange();
                zg.Invalidate();
                zg.Refresh();
            }
        }
    }
}

invalidate是收到命令选取合适的时机再刷新

refresh是强制重绘 refresh= invalidate+update

问题: 这里采用的是通常的竖直排列的图表形式。改成水平的话 Graphpane的大小不好控制。改不好 ??

时间: 2024-10-10 06:21:25

zedGraph画多个图表的相关文章

阿里天池大数据之移动推荐算法大赛总结及代码全公布

移动推荐算法比赛已经结束了一个多星期了,现在写一篇文章来回顾一下自己的参赛历程. 首先,对不了解这个比赛的同学们介绍一下这个比赛(引用自官网): 赛题简介 2014年是阿里巴巴集团移动电商业务快速发展的一年,例如2014双11大促中移动端成交占比达到42.6%,超过240亿元.相比PC时代,移动端网络的访问是随时随地的,具有更丰富的场景数据,比如用户的位置信息.用户访问的时间规律等. 本次大赛以阿里巴巴移动电商平台的真实用户-商品行为数据为基础,同时提供移动时代特有的位置信息,而参赛队伍则需要通

论文阅读方法

论文阅读方法 别先读摘要,从导言部分入手 找出大问题 这个领域正在设法解决什么问题? 以不超过5句话的篇幅总结背景 为解决这一"大问题",这一领域做过什么努力?之前的工作有什么局限?在作者看来,下一步需要做什么?简洁地解释为什么要进行这项研究. 找出具体问题 作者在他们的研究中究竟想回答什么问题?把这些问题(不一定是一个)写下来.如果是那种研究一个或者多个零假设的研究,把零假设辨别出来. 弄清解决手段 为了回答这些具体的问题,作者要怎么做? 阅读方法部分 为每一个实验画出一个图表,画出

深度学习性能提高

性能提高分为四个部分: 1. 通过数据提升性能 2. 通过算法提升性能 3. 通过算法调参提升性能 4. 通过嵌套模型提升性能 通常来讲,随着列表自上而下,性能的提升也将变小.例如,对问题进行新的架构或者获取更多的数据,通常比调整最优算法的参数能带来更好的效果.虽然并不总是这样,但是通常来讲是的. 1. 通过数据提升性能 对你的训练数据和问题定义进行适当改变,你能得到很大的性能提升.或许是最大的性能提升. 以下是我将要提到的思路: 获取更多数据 创造更多数据 重放缩你的数据 转换你的数据 特征选

PPT播放技巧

PPT的使用技巧 1.  快速放映:无需点击菜单栏中"观看放映"选项,直接按F5键,幻灯片就开始放映. 2.  快速停止放映:除了按"ESC"键外还可以按"-"键,快速停止放映. 3.  任意进到第n 张幻灯片:在放映中如果你想回到或进到第n 张幻灯片,怎样操作能快速实现?此时你只要按数字n,再同时按"+"和回车键,就可以实现. 4.快速显示黑屏,或从黑屏返回到幻灯片放映:在放映中如果你想显示黑屏,此时你只要按一下B 或者&q

(转)如何写好英文科技论文

英文科技论文写作是进行国际学术交流必需的技能.一般而言,发表在专业英语期刊上的科技论文在文章结构和文字表达上都有其特定的格式和规定,只有严格遵循国际标准和相应刊物的规定,才能提高所投稿件的录用率.    撰写英文科技论文的第一步就是推敲结构.最简单有效的方法即采用IMRaD形式(Introduction,Materials and Methods,Results,and Discussion),这是英文科技论文最通用的一种结构方式.         IMRaD结构的逻辑体现在它能依次回答以下问题

如何读懂一篇学术论文

如何读懂一篇学术论文 如何读懂一篇学术论文? 要想针对一个科学课题形成真正训练有素的观点,你需要熟悉这个领域当前的研究.而要想能够在众多对研究的解读中区分出良莠,你必须乐于阅读原文献,并具备独立阅读这些文献的能力.对于每一位博士和科学家来说,阅读和理解研究论文是他们在研究生院必须掌握的技能.你也可以学会它——不过和任何其他技能一样,你需要为之付出耐心和实践. 阅读科学论文跟读博客或报纸上有关科学的文章完全不一样.你不仅要用与原文不同的顺序来阅读各个章节,还必须记笔记.多读几遍,还可能得查阅其他论

什么是敏捷流程

敏捷建模(Agile Modeling,AM)的价值观包括了XP(Extreme Programming:极限编程)的四个价值观:沟通.简单.反馈.勇气,此外,还扩展了第五个价值观:谦逊. 敏捷开发是针对传统的瀑布开发模式的弊端而产生的一种新的开发模式,目标是提高开发效率和响应能力.除了原则和实践,模式也是很重要的,多研究模式及其应用可以使你更深层次的理解敏捷开发. 沟通 建模不但能够促进你团队内部的开发人员之间沟通.还能够促进你的团队和你的project stakeholder之间的沟通. 简

比较Perl、PHP、Python、Java和Ruby

!预览 · 语言的发展趋势一定是动静结合.刚柔并济 · Perl凝练晦涩,Python优雅明晰,Ruby精巧灵动,PHP简明单纯 · 或许优雅正是来自对细节和规范的重视 · (RoR)与Ruby结合之后,便如一只猱身而上灵猫,立刻衬托出Java和.NET大象般的身影 ?提问 Perl.Python.Ruby和PHP各自有何特点? 为什么动态语言多作为轻量级的解决方案? LAMP为什么受欢迎? Ruby on Rails为什么会流行? 编程语言的发展趋势是什么? :讲解 “剩下四种动态语言,我们将

项目协作与工作流程规范

项目协作与工作流程规范   俗话说磨刀不负砍柴功,如果不知道为什么这么做,能有什么好处,则即使指定的规范也不会良好的落地实施.下面就讨论规范及规范解决了哪些问题,和解决方法是什么: 1.项目之间能够互相调用,可扩展    问题: 你的项目可能会被别的项目调用,如果没有规范和文档,别的项目无法调用,或者调用api出现各种结果或错误.以后项目负责人,就没办法集中主要精力去做别的项目,而是花时间在解决调用者出现的问题上.    解决办法: 编写通用,可扩展的api,并给出错误代码和提示. 2.项目多人