*[[PLplot:http://plplot.sourceforge.net/]] [#tc328e7c]

#contents

*Summary [#r3877799]

PLplot は,グラフを作成するためのライブラリです.~
PDF, EPS, PS, EPS+LaTeX, SVG 形式などに出力可能です.~

-[[PLplot Home Page - Main:http://plplot.sourceforge.net/]]

**System requirements [#dd55c850]

Windows, OS X, Linux

**License [#z821faef]

LGPL

**ChangeLog [#v32a5d09]

http://sourceforge.net/p/plplot/code/HEAD/log/

**Related links [#s690b648]

-http://www.miscdebris.net/plplot_wiki/
-https://sites.google.com/site/makeplplot/
-[[PLplot でコマンドライン引数にデータファイルを指定する方法:http://krustf.hateblo.jp/entry/20130310/1362920130]]
-[[Momma's Wiki: PLplot - プロットライブラリ http://plplot.sourceforge.net/:http://www.eml.ele.cst.nihon-u.ac.jp/~momma/wiki/wiki.cgi/PLplot.html]]
-[[グラフ描画ライブラリ"PLplot"のインストール:http://d.hatena.ne.jp/A7M/20080125/1201242751]]

*Installation [#x8c634ec]
**Windows [#z2e8dabc]

***MinGW [#h997502f]

-[[Configure PLplot for MinGW/CLI:http://www.miscdebris.net/plplot_wiki/index.php?title=Configure_PLplot_for_MinGW/CLI]]

[[Poppler]] を参考にして MinGW, CMake, pkg-config 等をインストールします.

PLplot で PDF ファイルを作成する場合は [[cairo]] または [[Qt]] または [[libHaru]] が必要です.~

PLplot をインストールします.~
-DENABLE_d=ON にするとビルド時にエラーが発生したので,-DENABLE_d=OFF としました.~
-DPLD_pdf=ON にするとビルド時にエラーが発生したので,-DPLD_pdf=OFF としました.~

 $ curl -R -L -O http://download.sourceforge.net/plplot/plplot-5.10.0.tar.gz
 $ tar xvf plplot-5.10.0.tar.gz
 $ cd plplot-5.10.0
 $ mkdir build
 $ cd build
 $ cmake .. -G "MSYS Makefiles" -DCMAKE_INSTALL_PREFIX=/mingw -DBUILD_SHARED_LIBS=ON -DBUILD_TEST=ON -DENABLE_d=OFF -DPLD_pdf=OFF -DPLD_ps=ON -DPLD_pstex=ON
 $ make
 $ make install

**Linux [#o3b250b6]

***Arch Linux [#g5b0198c]

-https://aur.archlinux.org/packages/plplot/

*Uninstallation [#s2821338]
**Windows [#j9a86478]

***MinGW [#d6cfb753]

cmake の Makefile でインストールした場合は,make uninstall が使えないので,アンインストールする場合は,ビルドしたディレクトリで
 $ sed -e "s/\r$//" install_manifest.txt | sort | uniq | xargs rm
を実行します.

*Usage [#qd056acb]

**Code samples [#p78cac37]

-http://plplot.sourceforge.net/examples.php
-http://sourceforge.net/p/plplot/code/HEAD/tree/trunk/examples/

***Build on MinGW [#hc1cce0b]

サンプルをビルドします.

 $ cd /mingw/share/plplot5.10.0/examples/c
 $ make

PLplot でデバイスに出力する場合は wingcc.dll, ps.dll などのドライバ (DLL ファイル) が必要になります.~
/mingw/lib/plplot5.10.0/driversd/ にパスを通します.~

 $ export PATH=/mingw/lib/plplot5.10.0/driversd:$PATH

サンプルを実行します.~

 $ ./x00c
 PLplot library version: 5.10.0
 
 Plotting Options:
  < 1> wingcc     Win32 (GCC)
  < 2> ps         PostScript File (monochrome)
  < 3> psc        PostScript File (color)
  < 4> xfig       Fig file
  < 5> pstex      Combined Postscript/LaTeX files
  < 6> null       Null device
  < 7> mem        User-supplied memory device
  < 8> svg        Scalable Vector Graphics (SVG 1.1)
  < 9> pdf        Portable Document Format PDF
  <10> bmpqt      Qt Windows bitmap driver
  <11> jpgqt      Qt jpg driver
  <12> pngqt      Qt png driver
  <13> ppmqt      Qt ppm driver
  <14> tiffqt     Qt tiff driver
  <15> svgqt      Qt SVG driver
  <16> qtwidget   Qt Widget
  <17> epsqt      Qt EPS driver
  <18> pdfqt      Qt PDF driver
  <19> extqt      External Qt driver
  <20> memqt      Memory Qt driver

 Enter device number or keyword (stream 1): 1

デバイス番号を入力して Enter を入力すると指定したデバイスに結果が出力されます.~

コマンドライン引数からも指定できます.

 ./x00c -dev wingcc

EPS+LaTeX 形式で出力したい場合は Plotting Options に pstex を指定するか,コマンドラインから以下のようにすると x00c.eps と x00c.eps_t が出力されます.

 ./x00c -dev pstex -o x00c.eps

以下のようにして使用します.

 \documentclass{article}
 \usepackage[dvips]{graphicx}
 \begin{document}
 \input{x00c.eps_t}
 \end{document}

コマンドライン引数の詳細は

 ./x00c -h

で確認できます.

**C++11 [#id0ea4f5]

C++11 でも記述できるそうです → [[PLplotの使い方:http://d.hatena.ne.jp/ignisan/20110924/p1]]~
リンク先のコードは PLplot 5.10.0 でコンパイルできませんでした.~
以下のコードはリンク先のコードを修正したもので~
GCC 4.8.1, PLplot 5.10.0 でビルド,実行できます.~

 $ g++ -std=c++11 x03oldfix.cc -o x03oldfix `pkg-config --cflags --libs plplotd-c++`

----
 //
 // $ g++ -std=c++11 x03oldfix.cc -o x03oldfix `pkg-config --cflags --libs plplotd-c++`
 //
 #include <vector>
 #include <memory>
 #include <plstream.h>
 
 class Plots : public plstream {
 public:
     explicit Plots(int argc, const char** argv)
     {
         this->parseopts(&argc, argv, PL_PARSE_FULL | PL_PARSE_SKIP);
         this->scolbg(255, 255, 255);
         this->scol0(15, 0, 0, 0);
         // this->sdev("aqt");  // AquaTerm
         this->init();
     }
 
     auto plot(int num,
             const std::vector<double>& ax,
             const std::vector<double>& ay)
             -> void
     {
         this->col0(15);
         this->env(-1.3, 1.3, -0.3, 1.3, 1, 1);
         this->lab("X", "Y", "y=x#u2#d");
         this->col0(1);
         this->width(3);
         this->line(num, &ax[0], &ay[0]);
     }
 };
 
 auto main(int argc, const char** argv) -> int
 {
     constexpr double x_min = -1.0, x_max = 1.0;
     constexpr int num = 30;
     std::vector<double> ax(num), ay(num);
 
     for (auto i = 0; i < num; ++i) {
         ax[i] = x_min + (x_max - x_min) / (static_cast<double>(num) - 1.0) * i;
         ay[i] = ax[i] * ax[i];
     }
 
     auto pls = std::make_shared<Plots>(argc, argv);
     pls->plot(num, ax, ay);
 }
----

以下のコードは PLplot 5.10.0 の x03.cc を C++11 で記述したもので~
GCC 4.8.1, PLplot 5.10.0 でビルド,実行できます.~

 $ g++ -std=c++11 x03c++11.cc -o x03c++11 `pkg-config --cflags --libs plplotd-c++`

----
 //
 // $ g++ -std=c++11 x03c++11.cc -o x03c++11 `pkg-config --cflags --libs plplotd-c++`
 //
 #include <vector>
 #include <memory>
 #include <cmath>
 #include <cstdio>
 #include <plstream.h>
 
 class Polor : public plstream
 {
 public:
     explicit Polor( int, const char ** );
     auto plot() -> void;
 };
 
 
 Polor::Polor( int argc, const char ** argv )
 {
     // Parse and process command line arguments.
     this->parseopts( &argc, argv, PL_PARSE_FULL | PL_PARSE_SKIP );
 
     // Set orientation to portrait - note not all device drivers
     // support this, in particular most interactive drivers do not.
     this->sori( 1 );
 
     // Initialize PLplot.
     this->init();
 }
 
 auto Polor::plot() -> void
 {
     constexpr int degree = 360;
     constexpr int max_degree = degree + 1;
     constexpr double pi = 4.0 * atan( 1.0 );
     constexpr PLFLT dtr = pi / 180.0;
 
     auto x0 = std::vector< PLFLT >( max_degree );
     auto y0 = std::vector< PLFLT >( max_degree );
 
     for ( auto i = 0; i <= degree; ++i ) {
         x0[i] = std::cos( dtr * i );
         y0[i] = std::sin( dtr * i );
     }
     // Set up viewport and window, but do not draw box.
     this->env( -1.3, 1.3, -1.3, 1.3, 1, -2 );
 
     // Draw circles for polar grid
     for ( auto i = 1; i <= 10; ++i ) {
         this->arc( 0.0, 0.0, 0.1 * i, 0.1 * i, 0.0, static_cast< double >( degree ), 0.0, 0 );
     }
 
     this->col0( 2 );
 
     char text[4] = "";
     PLFLT theta, dx, dy, r, offset;
     for ( auto i = 0; i <= 11; ++i ) {
         theta = 30.0 * i;
         dx    = std::cos( dtr * theta );
         dy    = std::sin( dtr * theta );
 
         // Draw radial spokes for polar grid.
         this->join( 0.0, 0.0, dx, dy );
         std::sprintf( text, "%d", static_cast< int >( std::round( theta ) ) );
 
         // Write labels for angle.
 
         if ( theta < 9.99 ) {
             offset = 0.45;
         }
         else if ( theta < 99.9 ) {
             offset = 0.30;
         }
         else {
             offset = 0.15;
         }
 
         //Slightly off zero to avoid floating point logic flips at 90 and 270 deg.
         if ( dx >= -0.00001 ) {
             this->ptex( dx, dy, dx, dy, -offset, text );
         }
         else {
             this->ptex( dx, dy, -dx, -dy, 1. + offset, text );
         }
     }
 
     // Draw the graph.
     auto x = std::vector< PLFLT >( max_degree );
     auto y = std::vector< PLFLT >( max_degree );
     for ( auto i = 0; i <= degree; ++i ) {
         r    = std::sin( dtr * ( 5 * i ) );
         x[i] = x0[i] * r;
         y[i] = y0[i] * r;
     }
     this->col0( 3 );
     this->line( max_degree, x.data(), y.data() );
 
     this->col0( 4 );
     this->mtex( "t", 2.0, 0.5, 0.5, "#frPLplot Example 3 - r(#gh)=sin 5#gh" );
 }
 
 auto main( int argc, const char ** argv ) -> int
 {
     auto pls = std::make_shared< Polor >( argc, argv );
     pls->plot();
 }
----