Search This Blog

Friday, December 28, 2018

Curve Plotting with C++

C++ program တွေမှာ curve plotting လုပ်ဖို့ လိုလာရင် သုံးလို့ ရမယ့် နည်းလမ်း တချို့ကို ဆွေးနွေး ချင်ပါတယ်။ သုံးကြည့်မယ့် tools တွေက
တို့ ဖြစ်ပါတယ်။

Gnuplot

Gnuplot ကို Ubuntu ပေါ်မှာ install လုပ်ဖို့ အတွက် အောက်က command တွေကို သုံးနိုင် ပါတယ်။

$ sudo apt update
$ sudo apt install gnuplot


Install လုပ်ပြီး တဲ့ အခါ gnuplot ကို အောက်ပါ အတိုင်း စနိုင် ပါတယ်။

$ gnuplot


ပြီးတဲ့ အခါ လက်ရှိ ဗားရှင်း စတဲ့ အချက်အလက် တွေပေါ်လာ ပြီးတဲ့ အခါ gnuplot ရဲ့ prompt ကို ရောက်သွား ပါမယ်။ နမူနာ အနေနဲ့ sin(x) ကို plot လုပ်ကြည့်ပြီး၊ cos2(x) ကို ပါ အောက်က အတိုင်း ထပ် plot လုပ်ကြည့် လိုက်ရင် Figure. 1 မှာ ပြထား သလို တွေ့ရ ပါလိမ့်မယ် [Mig18]။ Gnuplot ကနေ ထွက်ဖို့ အတွက် q ကို ရိုက်ထည့် နိုင် ပါတယ်။

> plot sin(x)
> replot cos(x)**2
> q



Figure 1. Plotting sin(x) and cos2(x) to test gnuplot.


Gnuplot ကို C++ program ထဲ ကနေ လှမ်းခေါ် ပြီး သုံးဖို့ အတွက် Jeremy Conlin ရဲ့ gnuplot-cpp ကို သုံးလိုက် ပါမယ် [Con14, Gnu18]။ အဲဒီက နမူနာ ပရိုဂရမ် မှာပြထား သလို

gnuplot_i.hpp (https://github.com/yan9a/plotcpp/blob/master/gnuplot/gnuplot_i.hpp)

ကို include လုပ်ဖို့ လိုပါတယ်။ အဲဒီ header ဖိုင်မှာ plot ကို png ဖိုင် အနေနဲ့ သိမ်းဖို့ အတွက် ဖန်ရှင် တစ်ခု ကို ကိုယ့်ဟာကို ထပ်ဖြည့် ပြီး ပြုပြင် ထားပါတယ်။ ပြီးတဲ့ အခါ Gnuplot အတွက် instance တစ်ခု ကို ဖန်တီးပြီး သူ့ရဲ့ ဖန်ရှင် အမျိုးမျိုးကို ခေါ်သုံးလို့ ရပါပြီ။

#include "gnuplot_i.hpp"

...

Gnuplot g1;

... // generate x and y

g1.set_style("lines").plot_xy(x,y,"2d plot");


ဒေတာ တချို့ကို generate လုပ်ပြီး plot လုပ်ပြ၊ ပြီးတဲ့ အခါ png ဖိုင် အနေနဲ့ ပြန် plot ထုတ်ပြတဲ့ ရိုးရှင်းတဲ့ နမူနာ တစ်ခု ကို

gplot.cpp (https://github.com/yan9a/plotcpp/blob/master/gnuplot/gplot.cpp)

မှာ ပြထား ပါတယ်။ ပရိုဂရမ် ကို အောက်ပါ အတိုင်း compile လုပ်ပြီး၊ run ကြည့်ရင် Figure. 2 မှာ ပြထား သလို plot ကို တွေ့ရ မှာဖြစ်ပြီး၊ အဲဒီ plot ကို png ဖိုင် အနေနဲ့ လည်း ရလာ တာကို တွေ့ရ မှာပါ။

$ g++ gplot.cpp -o gplot
$ ./gplot



Figure 2. Output of gplot.cpp


gsyscall.cpp ပြထား သလိုမျိုး C++ ပရိုဂရမ် ထဲကနေ system call ခေါ်ပြီး တိုက်ရိုက် plot လုပ်တာ မျိုးလည်း လုပ်လို့ ရပါတယ်။

system("gnuplot -p -e \"set datafile separator ',';plot 'test.csv'\"");


Octave

Octave ပေါ်မှာ MatLAB code တွေနဲ့ လို သလို process လုပ်ပြီး၊ plot လုပ်ရ တာ တော်တော် အဆင်ပြေ ပါတယ်။ Octave ကိုတပ်ဆင် ဖို့ Windows တွေ အတွက်ဆို installer ကို သုံးနိုင် ပြီး၊ Debian Linux တွေ အတွက် ဆိုရင် လည်း အောက်က အတိုင်း တပ်ဆင် နိုင်ပါတယ်။

$ sudo apt install octave octave-image octave-statistics octave-control


ဒေတာ ဖိုင် တစ်ခု ကို ဖတ်ပြီး plot လုပ်ပြ တဲ့ MatLAB ဖန်ရှင် နမူနာ တစ်ခု နဲ့ အဲဒီ လို ရေးထားတဲ့ MatLAB program ကို C++ ကနေ လှမ်းပြီး run ခိုင်း၊ plot လုပ်ခိုင်း တဲ့ နမူနာ တစ်ခုကို အောက်က လင့်ခ် တွေမှာ တွေ့နိုင် ပါတယ်။

oplot.cpp (https://github.com/yan9a/plotcpp/blob/master/octaveplot/oplot.cpp)

ofunc.m (https://github.com/yan9a/plotcpp/blob/master/octaveplot/ofunc.m)

ပရိုဂရမ် ကို compile လုပ်ပြီး၊ run ကြည့်ရင် Figure. 3 မှာ ပြထား သလို plot တွေကို တွေ့ရ မှာ ဖြစ်ပြီး၊ key တစ်ခုခု ကို နှိပ်ပြီး ပရိုဂရမ် ကို အဆုံးသတ် နိုင် ပါတယ်။

$ g++ oplot.cpp -o oplot
$ ./oplot



Figure 3. Output of oplot.cpp


Matplotlib

Matplotlib ကို Ubuntu မှာ တပ်ဆင် ဖို့ အတွက် အောက်က command ကို သုံးနိုင် ပါတယ်။

$ sudo apt install python-matplotlib python-numpy python2.7-dev


C++ ပရိုဂရမ် ကနေ matplotlib ကို သုံးပြီး plot လုပ်ဖို့ အတွက် Benno Evers ရဲ့ matplotlib-cpp ကို သုံးလိုက် ပါမယ် [Eve14]။ ရိုးရှင်းတဲ့ နမူနာ တစ်ခု ကို အောက်က လင့်ခ်မှာ ဖော်ပြထား ပါတယ်။

mplot.cpp (https://github.com/yan9a/plotcpp/blob/master/matplot/mplot.cpp)

ပရိုဂရမ် ကို အောက်က အတိုင်း run ကြည့်ရင် ရလာတဲ့ ရလဒ် ကို Figure. 4 မှာ ဖော်ပြထား ပါတယ်။

$ g++ mplot.cpp -I/usr/include/python2.7 -lpython2.7 -o mplot
$ ./mplot



Figure 4. Output of mplot.cpp




References

[Mig18] Andrea Mignone. A Quick Guide to Gnuplot. 2018.
url: http://personalpages.to.infn.it/~mignone/Algoritmi_Numerici/gnuplot.pdf.

[Con14] Jeremy Conlin. gnuplot-cpp. 2014.
url: https://code.google.com/archive/p/gnuplot-cpp/.

[Gnu18] Gnuplot. gnuplot links. 2018.
url: http://www.gnuplot.info/links.html.

[Eve14] Benno Evers. matplotlib-cpp. 2014.
url: https://github.com/lava/matplotlib-cpp.

No comments:

Post a Comment