プログラミング/julia/グラフの書き方 のバックアップ差分(No.5)

更新


  • 追加された行はこの色です。
  • 削除された行はこの色です。
[[プログラミング/julia]]

* 目次 [#feeedfdd]

#contents

* Plots を使う [#m6aac946]

関数グラフの描画には [[Plots>http://docs.juliaplots.org/latest/]] というライブラリを使う。

これは様々なグラフ描画ライブラリを julia から同一の API で使えるようにするためのラッパーライブラリ。

実際の描画を行う Backend の描画ライブラリとして何を選ぶかによって、描画速度や仕上がりなどが結構変わってくる。

** インストール [#k3a82351]

バックエンドのライブラリがないと描画できないので、とりあえず GR, Plotly, PyPlot を入れておく。
バックエンドのライブラリがないと描画できないので、とりあえず GR も入れておく。

 LANG:julia
 Pkg.add("Plots")
 Pkg.add("GR")
 Pkg.add("Plotly")
 Pkg.add("PyPlot")
 
 # 最新版を使うには
 Pkg.checkout("Plots")

** バックエンドライブラリ [#we87f61f]

実際の描画を行うバックエンドライブラリはいろいろある。

http://docs.juliaplots.org/latest/backends/

例えばバックエンドライブラリとして GR を使うには、

 LANG:julia
 using Plots
 Plots.gr() // Plots のバックエンドとして GR を使う
 gr() // こう書いても同じ
 // 引数としてオプションを渡せる
 // gr() には引数としてオプションを渡せる
 
 plot() // GR を使ったグラフが出力される

などとする。

2018春時点では、たぶん、有名なのは GR, Plotly, PyPlot の3つ。
2018春時点では、たぶん、有名なのは GR, Plotly, PyPlot の3つ。PGFPlots や GLVisualize もまずまず?

各ライブラリの対応表はこちら:~
http://docs.juliaplots.org/latest/supported/

- GR : Plots.gr()
-- 出力が svg になるので、印刷してもキレイ
-- 点がたくさんあるとブラウザが固まる
-- 普段使いにはこれがベスト?
- Plotly : Plots.plotly()
-- マウスでグラフの表示範囲などを調整可能
-- 出力が svg になるので、印刷してもキレイ
-- 点がたくさんあるとブラウザが固まる
-- Gists 上などでは javascript が許可されないため表示できない
-- jupyter notebook のリロードでエラーになり画像が表示されない場合がある
-- 試行錯誤中は良いかもしれないけれど最終版としてはつらい
- PyPlot : Plots.pyplot()
-- 出力が png になるため、データ点の多いグラフでも Web ブラウザに負担がかからない
-- ただ印刷などすると dpi 不足で画像が粗くなる
-- PyCall の設定が必要(下記参照)
-- データ点の多いグラフ専用?
- PGFPlots : Plots.pgfplots()
-- 出力が svg になるので、印刷してもキレイ
-- 点がたくさんあるとブラウザが固まる
-- 

それぞれの表示はこんな感じ。~
- Plotly の円グラフの表示がおかしい
- PyPlot の円グラフが楕円になってしまっている

&ref(test-julia-plots.png,,50%);

GR のグラフは拡大してもキレイ

&ref(test-julia-plots-gr.png,border,50%);

PyPlot のグラフはぼやける

&ref(test-julia-plots-pyplot.png,border,50%);

Plotly のグラフはインタラクティブに編集できる。

&attachref(test-julia-plots-plotly.gif,border,50%);

でもブラウザ上でリロードするだけで、Plotly のグラフは

 Javascript error adding output!
 ReferenceError: Plotly is not defined
 See your browser Javascript console for more details.

などというエラーが出て表示されなくなってしまう。

Gist 上でも無理。

#gist(osamutake/da4856f49e025e4646214a0ce690ba06);

* このあたりを見る? [#v8a20489]
nbviewer でもダメだった。

Plots/GR: グラフ package のおすすめ~
http://www.cas.cmc.osaka-u.ac.jp/~paoon/misc/julia/post/trouble-plots-package/
http://nbviewer.jupyter.org/gist/osamutake/da4856f49e025e4646214a0ce690ba06

JupyterでJuliaを動かして回帰分析をやってみる。~
https://qiita.com/kenmatsu4/items/b77ecec75418cbaa2212
** gist から nbviewer への飛び方 [#j586e609]

jupyter notebookで触れるプロットを描く~
http://ksknw.hatenablog.com/entry/2016/08/04/233103
gist 上で .ipynb を見たとき、右上に θ マークが表示されている場合があり、
そこにカーソルを合わせると nbviewer へのリンクが出るのだけれど、

Julia言語と Plots + GR で複素関数のgifアニメーションを作る~
http://optie.hatenablog.com/entry/2018/03/29/210619
&ref(gist-to-nbviewer.png,border,50%);

GR - examples~
http://docs.juliaplots.org/latest/examples/gr/
これをクリックしてもうまく nbviewer に繋がらない。

PlotThemes~
https://github.com/JuliaPlots/PlotThemes.jl
本来なら

* Plotly を使う? [#add06469]
http://nbviewer.jupyter.org/gist/osamutake/da4856f49e025e4646214a0ce690ba06

https://qiita.com/deaikei/items/b71c1ca2c4c2a2c37526
へ飛ぶべきが、

 $ python3 -m pip install numpy plotly
http://nbviewer.jupyter.org/github/osamutake/da4856f49e025e4646214a0ce690ba06/blob/9c7f6f6d2adc84c7dc78fa9874b22aa05b7d10cc/test-julia-plots.ipynb

これとてもいいのだけれど、これを使った notebook のファイルサイズが非常に大きくなるみたい。
へ飛んでしまう。

簡単なグラフでも5メガバイトとか。
たぶん、github に入れた .ipynb ファイルからだとうまく行くんだと思う。

で、gist へ保存ができなくなってしまった。
github の文字を gist に直し、/blob/ 以下を削除すれば良いのだけれど、
もっと簡単には http://nbviewer.jupyter.org/ に gist の URL を入れることで本来のページに飛べる。

どうしたらいいか、考え中。
* バックエンドライブラリのインストール [#t3742bc9]

* PyPlot を使う [#k1b8dc14]
** GR のインストール [#b191daad]

 LANG:console
 $ julia
 julia> Pkg.add("GR")

これだけでOK

** GLVisualize のインストール [#vf93d43a]

 LANG:console
 $ julia
 julia> Pkg.add("GLVisualize ")
  ...
  CMake Error at CMakeLists.txt:222 (message):
    The RandR library and headers were not found
 julia>^D

https://github.com/openMVG/openMVG/issues/85 にしたがって、

 LANG:console
 $ sudo apt-get install xorg-dev libglu1-mesa-dev
  パッケージリストを読み込んでいます... 完了
  依存関係ツリーを作成しています
  状態情報を読み取っています... 完了
  libglu1-mesa-dev はすでに最新バージョン (9.0.0-2.1) です。
  libglu1-mesa-dev は手動でインストールしたと設定されました。
  以下の追加パッケージがインストールされます:
    libdmx-dev libdmx1 libfontconfig1-dev libfontenc-dev libfreetype6-dev libfs-dev libfs6 libice-dev
    libmirclient-dev libmircommon-dev libmircookie-dev libmircookie2 libmircore-dev libpciaccess-dev
    libpixman-1-dev libprotobuf-dev libprotobuf9v5 libsm-dev libxaw7-dev libxcomposite-dev libxcursor-dev
    libxfont-dev libxfont1-dev libxfont2 libxft-dev libxi-dev libxinerama-dev libxkbcommon-dev
    libxkbfile-dev libxmu-dev libxmu-headers libxmuu-dev libxpm-dev libxrandr-dev libxrender-dev
    libxres-dev libxss-dev libxt-dev libxtst-dev libxv-dev libxvmc-dev libxxf86dga-dev
    mir-client-platform-mesa-dev x11proto-bigreqs-dev x11proto-composite-dev x11proto-dmx-dev
    x11proto-dri3-dev x11proto-fonts-dev x11proto-present-dev x11proto-randr-dev x11proto-record-dev
    x11proto-render-dev x11proto-resource-dev x11proto-scrnsaver-dev x11proto-video-dev
    x11proto-xcmisc-dev x11proto-xf86bigfont-dev x11proto-xf86dga-dev x11proto-xf86dri-dev
    x11proto-xinerama-dev xserver-xorg-dev
  提案パッケージ:
    libice-doc libsm-doc libxaw-doc libxt-doc
  以下のパッケージが新たにインストールされます:
    libdmx-dev libdmx1 libfontconfig1-dev libfontenc-dev libfreetype6-dev libfs-dev libfs6 libice-dev
    libmirclient-dev libmircommon-dev libmircookie-dev libmircookie2 libmircore-dev libpciaccess-dev
    libpixman-1-dev libprotobuf-dev libprotobuf9v5 libsm-dev libxaw7-dev libxcomposite-dev libxcursor-dev
    libxfont-dev libxfont1-dev libxfont2 libxft-dev libxi-dev libxinerama-dev libxkbcommon-dev
    libxkbfile-dev libxmu-dev libxmu-headers libxmuu-dev libxpm-dev libxrandr-dev libxrender-dev
    libxres-dev libxss-dev libxt-dev libxtst-dev libxv-dev libxvmc-dev libxxf86dga-dev
    mir-client-platform-mesa-dev x11proto-bigreqs-dev x11proto-composite-dev x11proto-dmx-dev
    x11proto-dri3-dev x11proto-fonts-dev x11proto-present-dev x11proto-randr-dev x11proto-record-dev
    x11proto-render-dev x11proto-resource-dev x11proto-scrnsaver-dev x11proto-video-dev
    x11proto-xcmisc-dev x11proto-xf86bigfont-dev x11proto-xf86dga-dev x11proto-xf86dri-dev
    x11proto-xinerama-dev xorg-dev xserver-xorg-dev
  アップグレード: 0 個、新規インストール: 62 個、削除: 0 個、保留: 36 個。
  5,363 kB 中 5,329 kB のアーカイブを取得する必要があります。
  この操作後に追加で 25.5 MB のディスク容量が消費されます。
 $ julia
 julia> Pkg.build("GLVisualize ")

** Plotly のインストール [#add06469]

juliabox ならそのまま使えるのだけれど、
以下は自分で建てた jupyter サーバーにインストールする場合の話。

https://qiita.com/deaikei/items/b71c1ca2c4c2a2c37526 を見ながら。

julia 上で
 LANG: julia
 Pkg.add("Plotly")

とする前に、python の plotly モジュールを入れておかないとダメ。

 LANG:console
 $ python3 -m pip install plotly
 $ julia
 julia> Pkg.add("Plotly")

こうするのが正解。


** PyPlot のインストール [#k1b8dc14]

juliabox ならそのまま使えるのだけれど、
以下は自分で建てた jupyter サーバーにインストールする場合の話。

正しい手順はこちら > [[#e720f643]]

*** 試行錯誤 [#oc9732d3]

matplotlib を使うので、

 LANG:console
 $ sudo python3 -m pip install matplotlib

とすれば、python から使うのは簡単だった。

#gist(13f0268cafbb92bd1b270503b1c738a5);

julia から使うには、単に Pkg.add("PyPlot") しただけだと、

 InitError: Failed to import required Python module matplotlib.
 
 For automated matplotlib installation, try configuring PyCall to use the Conda.jl package's Python "Miniconda" distribution within Julia. Relaunch Julia and run:
     ENV["PYTHON"]=""
     Pkg.build("PyCall")
 before trying again.
 
 The pyimport exception was: PyError (ccall(@pysym(:PyImport_ImportModule), PyPtr, (Cstring,), name)
 
 The Python package matplotlib could not be found by pyimport. Usually this means
 that you did not install matplotlib in the Python version being used by PyCall.
 
 PyCall is currently configured to use the Python version at:
 
 python
 
 and you should use whatever mechanism you usually use (apt-get, pip, conda,
 etcetera) to install the Python package containing the matplotlib module.
 
 One alternative is to re-configure PyCall to use a different Python
 version on your system: set ENV["PYTHON"] to the path/name of the python
 executable you want to use, run Pkg.build("PyCall"), and re-launch Julia.
 
 Another alternative is to configure PyCall to use a Julia-specific Python
 distribution via the Conda.jl package (which installs a private Anaconda
 Python distribution), which has the advantage that packages can be installed
 and kept up-to-date via Julia.  As explained in the PyCall documentation,
 set ENV["PYTHON"]="", run Pkg.build("PyCall"), and re-launch Julia. Then,
 To install the matplotlib module, you can use `pyimport_conda("matplotlib", PKG)`,
 where PKG is the Anaconda package the contains the module matplotlib,
 or alternatively you can use the Conda package directly (via
 `using Conda` followed by `Conda.add` etcetera).
 
 ) <type 'exceptions.ImportError'>
 ImportError('No module named matplotlib',)
 
 
 during initialization of module PyPlot
 
 Stacktrace:
  [1] pyimport_conda(::String, ::String, ::String) at /home/osamu/.julia/v0.6/PyCall/src/PyCall.jl:609
  [2] __init__() at /home/osamu/.julia/v0.6/PyPlot/src/init.jl:175
  [3] _include_from_serialized(::String) at ./loading.jl:157
  [4] _require_from_serialized(::Int64, ::Symbol, ::String, ::Bool) at ./loading.jl:200
  [5] _require_search_from_serialized(::Int64, ::Symbol, ::String, ::Bool) at ./loading.jl:236
  [6] _require(::Symbol) at ./loading.jl:441
  [7] require(::Symbol) at ./loading.jl:405
  [8] include_string(::String, ::String) at ./loading.jl:522

と言われ、PyCall を build する必要があった。

*** 正しい手順 [#e720f643]

 LANG:console
 $ sudo python3 -m pip install matplotlib
 $ julia
 julia> Pkg.add("PyPlot")
 julia> ENV["PYTHON"]=""
 julia> Pkg.build("PyCall")

ENV["PYTHON"]="" はシステムの python を使うためのおまじないっぽい?

* GR を使う [#i952e995]
** PGFPlots のインストール [#a20734e0]

グラフは svg で書かれるようで、クオリティーは高いけれど、
あまり複雑なグラフを表示するとブラウザが固まる。
GR, Plotly, PyPlot は juliabox でもそのまま使えるのだけれど、
PGFPlots は juliabox では使えないため、使いたければ自分で建てた 
jupyter サーバーにインストールするしかない。

正しい手順はこちら > [[#beed29ca]]

*** 試行錯誤 [#t5bf2924]

jupyter の上から Pkg.add("PGFPlots") としたところ、途中で

 Installing dependency libmagickwand-6.q16-2 via `sudo apt-get install libmagickwand-6.q16-2`:
 
 sudo: 端末 (tty) が存在せず、パスワードを尋ねる (askpass) プログラムが指定されていません
 =============================[ ERROR: ImageMagick ]=============================
 
 LoadError: failed process: Process(`sudo apt-get install libmagickwand-6.q16-2`, ProcessExited(1)) [1]
 while loading /home/osamu/.julia/v0.6/ImageMagick/deps/build.jl, in expression starting on line 122

というエラーが出た。
そこでコンソールからやってみたら、

 LANG:console
 $ julia
 julia> Pkg.build("PGFPlots")
  INFO: Building SpecialFunctions
  INFO: Building FFTW
  INFO: Building ImageMagick
  Installing dependency libmagickwand-6.q16-2 via `sudo apt-get install libmagickwand-6.q16-2`:
  [sudo] osamu のパスワード:
  パッケージリストを読み込んでいます... 完了
  依存関係ツリーを作成しています
  状態情報を読み取っています... 完了
  以下の追加パッケージがインストールされます:
    ghostscript gsfonts imagemagick-common libcupsfilters1 libcupsimage2 libgs9 libgs9-common libijs-0.35 libjbig2dec0 liblqr-1-0 libmagickcore-6.q16-2 libpaper-utils libpaper1
    poppler-data
  提案パッケージ:
    ghostscript-x hpijs fonts-droid texlive-lang-cjk libmagickcore-6.q16-2-extra poppler-utils fonts-arphic-ukai fonts-arphic-uming fonts-nanum
  以下のパッケージが新たにインストールされます:
  ghostscript gsfonts imagemagick-common libcupsfilters1 libcupsimage2 libgs9 libgs9-common   libijs-0.35 libjbig2dec0 liblqr-1-0 libmagickcore-6.q16-2 libmagickwand-6.q16-2
    libpaper-utils libpaper1 poppler-data
  アップグレード: 0 個、新規インストール: 15 個、削除: 0 個、保留: 20 個。
  12.1 MB のアーカイブを取得する必要があります。
  この操作後に追加で 48.1 MB のディスク容量が消費されます。
  続行しますか? [Y/n] 中断しました。
  ===============================================================================[ ERROR: ImageMagick ]===============================================================================
  
  LoadError: failed process: Process(`sudo apt-get install libmagickwand-6.q16-2`, ProcessExited(1)) [1]
  while loading /home/osamu/.julia/v0.6/ImageMagick/deps/build.jl, in expression starting on line 122
  
  ====================================================================================================================================================================================
  INFO: Building CodecZlib
  
  ==================================================================================[ BUILD ERRORS ]==================================================================================
  
  WARNING: ImageMagick had build errors.
  
   - packages with build errors remain installed in /home/osamu/.julia/v0.6
   - build the package(s) and all dependencies with `Pkg.build("ImageMagick")`
   - build a single package by running its `deps/build.jl` script
  
  ====================================================================================================================================================================================

となって、やはりエラー。おしい。

 LANG:console
 $ sudo apt-get install libmagickwand-6.q16-2
 $ julia
 julia> Pkg.build("PGFPlots")

で入った。

でも、plot を呼ぶと

 Error saving as SVG
 
 could not spawn `lualatex --enable-write18 --output-directory=. tikzpicture`: no such file or directory (ENOENT)

とのエラー。texlive-luatex を入れれば良いのかと思ったのだけれど、

 LANG:console
 $ sudo apt-get install texlive-luatex
 $ lua^T
  lua2dox_filter   luajittex        luaotfload-tool  luatex

で、lualatex というコマンドは入らなかった?

http://mickey-happygolucky.hatenablog.com/entry/2016/03/01/234228 を見て、

 LANG:console
 $ sudo apt-get install texlive-lang-cjk lmodern texlive-xetex
 $ which lualatex
  /usr/bin/lualatex

これでエラーメッセージが変わって、

 Error saving as SVG
 
 could not spawn `pdf2svg tikzpicture.pdf tikzpicture.svg`: no such file or directory (ENOENT)

そこで、

 LANG:console
 $ sudo apt-get install pdf2svg

これで正しく動作するようになった。

*** 正しい手順 [#beed29ca]

 LANG:console
 $ sudo apt-get install libmagickwand-6.q16-2 texlive-luatex texlive-lang-cjk lmodern texlive-xetex pdf2svg
 $ julia
 julia> Pkg.add("PGFPlots")

こうかな。

* このあたりを見る? [#v8a20489]

Plots/GR: グラフ package のおすすめ~
http://www.cas.cmc.osaka-u.ac.jp/~paoon/misc/julia/post/trouble-plots-package/

JupyterでJuliaを動かして回帰分析をやってみる。~
https://qiita.com/kenmatsu4/items/b77ecec75418cbaa2212

jupyter notebookで触れるプロットを描く~
http://ksknw.hatenablog.com/entry/2016/08/04/233103

Julia言語と Plots + GR で複素関数のgifアニメーションを作る~
http://optie.hatenablog.com/entry/2018/03/29/210619

GR - examples~
http://docs.juliaplots.org/latest/examples/gr/

PlotThemes~
https://github.com/JuliaPlots/PlotThemes.jl


* コメント・質問 [#xbcaa13f]

#article_kcaptcha


Counter: 39745 (from 2010/06/03), today: 6, yesterday: 12