使用ZedGraph製作動態繪圖

1.目的

在電機電子硬體控制中,經常需要人機介面的應用,而圖表顯示更是少不了,先前在製作相關專案的時候遇到了此需求,後來找到了ZedGraph這個資源,此模組在2003年就已開發,在效能上來說我覺得足以滿足大部分的需求,而控制性(設定參數)等非常具有彈性。

然而ZedGraph的Line Charts Sample code只提供了靜態顯示的展示,但是透過配合X軸座標的設定即可變成動態的顯示的圖表功能,可製作出類似似波器的圖形顯示介面。

2.方法

一開始初始化圖形的時候,我們必須透過AddCurve去增加顯示的曲線,而在新增曲線的時候就必須給定PointPairList變數,該變數也是該曲線顯示的資料來源,所以首先我們必須動態的對PointPairList變數增加顯示資料。

而透過XAxis.Scale.Min與XAxis.Scale.Max則可以設定X軸刻度的上下限值,配合一邊新增資料的同時也更改XAxis.Scale.Min與XAxis.Scale.Max的設定值,即可達到動態滾動滿版的圖形顯示介面。

下圖是一個1KHz取樣擷取LoadCell產生的訊號波形,而我把電風扇放到LoadCell上使電風扇開啟及關閉所產生的振動訊號

Testing dynamic curve

3.相關連結

http://zedgraph.sourceforge.net/samples.html

https://sourceforge.net/projects/zedgraph/

25 thoughts on “使用ZedGraph製作動態繪圖

  1. Hi,就是我用zedctr 他5.5ver以上可以
    滑鼠指過去有x.y value,但是我要把指過去的這個x y val, display在textbox上 要怎麼做 感謝回覆
    我看zedctr.point有buffer ary放值 可是我取不出來qq?

  2. Hi 承翰,

    這樣說起來有點複雜,你看作者的範例中關於游標滑到Data Point點上作處裡的方法....

    zg1.PointValueEvent += new ZedGraphControl.PointValueHandler( MyPointValueHandler );

    您可能需要在MyPointValueHandler對要顯示的textbox作處理即可。

    private string MyPointValueHandler( ZedGraphControl control, GraphPane pane,
    CurveItem curve, int iPt )
    {
    // Get the PointPair that is under the mouse
    PointPair pt = curve[iPt];

    return curve.Label.Text + " is " + pt.Y.ToString( "f2" ) + " units at " + pt.X.ToString( "f1" ) + " days";
    }

  3. 不好意思 這個有點看不懂
    比如我有5點,所以可以連出一條曲線,目前滑鼠移過去,可以針對那5的點原作者是秀該點的值
    那我希望可以點到那一個點告訴我那個是5個點鐘的哪一點idx,這樣我可以利用
    zedGraphControl1_MouseClick去抓到curve.Points[idx]裡面的x,y val
    但idx目前我無法取得 這樣 感謝您

  4. 算是 就是他原本的功能還是保持
    但是我要加功能在textbox上面
    利用該點idx帶出曲線上的xy val
    這樣我才可以計算兩點的查值
    等於示波器量測的功能這樣

  5. Hi 承翰,

    我的理解是

    return curve.Label.Text + " is " + pt.Y.ToString( "f2" ) + " units at " + pt.X.ToString( "f1" ) + " days";

    pt.Y跟pt.X 不就是滑鼠游標上該點位的資料嗎?

    委派事件

    private string MyPointValueHandler( ZedGraphControl control, GraphPane pane, CurveItem curve, int iPt )

    引發事件後CurveItem curve就是所有點位的資料 curve.Point

    int iPt 就是引發該事件的index索引值

    請問你的開發平台是C#?還是...?

  6. 哈 我只參考到舊版的跟改寫別人的code+我自己的
    這段我有看到了 大神 我想問一下
    所以我是改寫
    private string MyPointValueHandler( ZedGraphControl control, GraphPane pane,
    CurveItem curve, int iPt )
    {
    // Get the PointPair that is under the mouse
    PointPair pt = curve[iPt];

    return curve.Label.Text + " is " + pt.Y.ToString( "f2" ) + " units at " + pt.X.ToString( "f1" ) + " days";
    }
    這段嗎? 因為我call dll 她事件不是直接包起來的嗎?
    這樣MyPointValueHandler可以用+=進去?

  7. 這段是範例裡面的委派呼叫的程式,委派透過

    zg1.PointValueEvent += new ZedGraphControl.PointValueHandler( MyPointValueHandler );

    加入zg1的事件,但是他設計是hover on data point的時候觸發,似乎沒有click的事件,

    但能滿足使用需求才是。

  8. Hi,
    這樣如果我在click事件裡面委託這段有機會達到嗎?
    反正我只要打在on data point做這個事情就可以了
    感謝您耐心的回覆啊
    Qq

  9. Hi 承翰,

    我沒有仔細思考過click事件要怎麼去設計他

    但是直覺想法是click事件應如同hover事件一樣,是設計在zedGraph元件中,所以可能會需要修改dll本身,或者要再確認一下原作者是否留有增加事件的函數可以使用。

    待您自己發覺囉~

  10. Hi jed
    我搞了一個下午 還是研究不出來@@"
    dll本身可以修改嗎?? 不是都只能按F12去看索引 要怎麼修改呢><?

    還有int iPt 這個值我一定要得到,但是看起來是事件觸發後,他會自己把iPt傳進PointEditHandler orPointValueHandler?
    我需要iPt才有辦法做click的事件...

    public delegate string PointEditHandler(ZedGraphControl sender, GraphPane pane, CurveItem curve, int iPt);
    public delegate string PointValueHandler(ZedGraphControl sender, GraphPane pane, CurveItem curve, int iPt);

  11. Hi 承翰,

    dll本身是無法修改的,因為她是經過編譯後的檔案,你可能要去載zedgraph的source code才有辦法修改。

    您提到的"int iPt 這個值我一定要得到,但是看起來是事件觸發後,他會自己把iPt傳進PointEditHandler orPointValueHandler? "這個行為就是寫在dll原始檔裡面的動作,所以如果你真的是要Click的動作可能就真的要去修改了。

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料