プログラミング言語 Julia でグラフを描画する

プログラミング言語の [Julia](http://julialang.org/) でグラフを描画する環境を構築してみました。[PySide パッケージ](https://github.com/jverzani/PySide.jl) を追加しています。
文末に掲載したグラフを表示するサンプルプログラムは [Julia](http://julialang.org/) の [PySide パッケージ](https://github.com/jverzani/PySide.jl) に添付されているものに一部修正を加えたものです(最後の行に `PySide.app[:exec_]()` を加えました)。
(尚、バグとかご意見ありましたら https://twitter.com/akmiyoshi までお願いします)

> Windows 7 上での環境構築の手順を<del>(後で)掲載したいと思います</del>記載しました。
> 興味のある方はストックをお願いします。

> 筆者の環境は Windows 7 Home Premium 64bit ですが、環境構築はすべて32bit版のプログラムをインストールしました。
> この手順に従えば Windows OS (XP SP2以降) の 32bit 版および 64bit 版の両方で動作すると思います。

> 【追記】2014/07/04 に手順 4, 6, 11 を追加しました。2014/07/04 以前にこの記事を見て環境を構築した方は手順 4, 6, 11 を実行してください。よろしくお願いします。

![pyqtgraph.gif](https://qiita-image-store.s3.amazonaws.com/0/32879/7f169a06-4cea-3d91-82a2-d09a3a5f927f.gif)

##1. Python 2.7.7 (32bit)をインストールする。

   * https://www.python.org/download/ から [Python 2.7.7 Windows Installer](https://www.python.org/ftp/python/2.7.7/python-2.7.7.msi) をダウンロードする。(X86-64 Installer ではないので注意)
   * python-2.7.7.msi を起動してインストール。デフォルトの C:\Python27 にインストールする。 **「Add python.exe to Path」を有効にしておく** (デフォルトでは無効になっています)。

![2014-0701-1224.png](https://qiita-image-store.s3.amazonaws.com/0/32879/55448232-4323-1c57-aa19-d181e3c378a0.png)

##2. numpy (32bit)をインストールする。

   * http://sourceforge.net/projects/numpy/files/NumPy/1.8.1/ から [numpy-1.8.1-win32-superpack-python2.7.exe](http://sourceforge.net/projects/numpy/files/NumPy/1.8.1/numpy-1.8.1-win32-superpack-python2.7.exe/download) をダウンロードする。
   * numpy-1.8.1-win32-superpack-python2.7.exe を起動して、デフォルトの設定でインストールする。

##3. scipy (32bit)をインストールする。
   * http://sourceforge.net/projects/scipy/files/scipy/0.14.0/ から [scipy-0.14.0-win32-superpack-python2.7.exe](http://sourceforge.net/projects/scipy/files/scipy/0.14.0/scipy-0.14.0-win32-superpack-python2.7.exe/download) をダウンロードする。
   * scipy-0.14.0-win32-superpack-python2.7.exe を起動して、デフォルトの設定でインストールする。

##4. matplotlib をインストールする。(2014/07/04に追加)
* http://matplotlib.org/downloads.html から [matplotlib-1.3.1.win32-py2.7.exe](https://downloads.sourceforge.net/project/matplotlib/matplotlib/matplotlib-1.3.1/matplotlib-1.3.1.win32-py2.7.exe) をダウンロードする。
* matplotlib-1.3.1.win32-py2.7.exe を起動して、デフォルトの設定でインストールする。

##5. pip (Python のパッケージをインストール／管理するためのツール) をインストールする。

   * https://raw.githubusercontent.com/pypa/pip/master/contrib/get-pip.py をWebブラウザで開く
   * Google Chrome の場合は、テキストの部分を右クリックして「名前をつけて保存」を選択する。Internet Explorer の場合は、Altキーを押して「ファイル」メニューから「名前をつけて保存」を選択する。(名前をつけて保存するやり方が分からない場合は、Ctrl-A でテキストを全部選択してテキストエディタに貼り付けて、get-pip.py という名前で保存する)
   * コマンドプロンプト(「スタートボタン」⇒「すべてのプログラム」⇒「アクセサリ」⇒「コマンドプロンプト」)を起動以下のように <del>python から</del> get-pip.py を起動する。(「c:\get-pip.py」は C ドライブ直下に get-pip.py を保存した場合の例)
   
```text
C:\Users\root>c:\get-pip.py
```

##6. matplotlib の依存ライブラリをインストールする。(2014/07/04に追加)
C:\Users\root>cd \Python27\Scripts
   * コマンドプロンプトを起動して、カレントディレクトリを「C:\Python27\Scripts」に変更後「pip install -U python-dateutil」「pip install -U pyparsing」を実行する。

```text
C:\Users\root>cd \Python27\Scripts
C:\Python27\Scripts>pip install -U python-dateutil
C:\Python27\Scripts>pip install -U pyparsing
```

##7. PySide をインストールする。
   * コマンドプロンプトを起動して、カレントディレクトリを「C:\Python27\Scripts」に変更後「pip install -U PySide」を実行する。

```text
C:\Users\root>cd \Python27\Scripts
C:\Python27\Scripts>pip install -U PySide
```

##8. PyOpenGL をインストールする。

   * コマンドプロンプトを起動して、カレントディレクトリを「C:\Python27\Scripts」に変更後「pip install -U PyOpenGL」を実行する。

```text
C:\Users\root>cd \Python27\Scripts
C:\Python27\Scripts>pip install -U PyOpenGL
```

##9. PyQtGraph (32bit)をインストールする。

   * http://www.pyqtgraph.org/ から [pyqtgraph-0.9.8.win32.exe](http://www.pyqtgraph.org/downloads/pyqtgraph-0.9.8.win32.exe) をダウンロードする。
   * pyqtgraph-0.9.8.win32.exe を起動して、デフォルトの設定でインストールする。
   * C:\Python27\Lib\site-packages\pyqtgraph\examples 配下の *.py をダブルクリックしていろいろなグラフ(2D/3D)が表示されるのを確認する。


##10. Julia (32bit)をインストールする。

   * http://julialang.org/downloads/ から [julia-0.2.1-win32.exe](http://s3.amazonaws.com/julialang/bin/winnt/x86/0.2/julia-0.2.1-win32.exe) をダウンロードする。
   * julia-0.2.1-win32.exe を起動して、Cドライブの直下(C:\\)に展開する。
   * 解凍後のフォルダ名が「julia-e44b593905」のような名前になるので「julia-0.2.1-win32」に変更しておく。
   * 「C:\julia-0.2.1-win32\julia.bat」へのショートカットをデスクトップに作っておく。
   * 「C:\julia-0.2.1-win32\julia.bat」をテキストエディタで開いて編集する。最後の行の下に「pause」と入力しておく。(このステップは任意ですが、Julia のプログラムでエラーが出た時に有用です)

##11. Julia に PyPlot パッケージを追加する。(2014/07/04に追加)
   * julia.bat へのショートカットをダブルクリックして Julia のインタプリタを起動する。
   * 「Pkg.add("PyPlot")」を実行する。

```text
julia> Pkg.add("PyPlot")
```

##12. Julia に PySide パッケージを追加する。

   * julia.bat へのショートカットをダブルクリックして Julia のインタプリタを起動する。
   * 「Pkg.add("PySide")」を実行する。

```text
julia> Pkg.add("PySide")
```

##13. サンプルプログラムを実行する。

   * 文末のソースコード(pyqtgraph.jl)を「pyqtgraph.jl」というファイル名で任意のディレクトリに保存。
   * 保存した「pyqtgraph.jl」をダブルクリックする。「インストールされたプログラムの一覧からプログラムを選択する」を選んで「OK」をクリックする。次に「参照」を押して「C:\julia-0.2.1-win32\julia.bat」を選択して「開く」をクリックする。(拡張子「.jl」に対して「julia.bat」を関連付ける)
   * 上記の(9つのグラフの)画面が表示されれば成功。

```text:pyqtgraph.jl
## using the PyQtGraph submodule
## Examples from pyqtgraphs plotting.py
## translated into julia style

using PySide
reload(Pkg.dir("PySide", "src", "pyqtgraph.jl"))
using PyQtGraph
using PyCall


w = Widget()
lyt = VBoxLayout(w)
setLayout(w, lyt)

## Graphics Layout Widget make grid of plot devices
win = GraphicsLayoutWidget(w)
addWidget(lyt, win)
set_size(w, 800, 600)

raise(w)

## addPlot adds a plot device in next column over and returns a plot object
p1 = addPlot(win, title="Basic array plotting")
p1.plot(randn(100))

p2 = addPlot(win, title="Multiple curves")
p2.plot(randn(100), pen=(255,0,0))
p2.plot(randn(100) .+ 5, pen=(0, 255, 0))
p2.plot(randn(100) .+ 10, pen=(0,0,255))


p3 = addPlot(win, title="Drawing with points")
p3.plot(randn(100), pen=(200, 200, 200), symbolBrush=(255,0,0), symbolPen="w")

nextRow(win)

p4 = addPlot(win, title="Parametric, grid enabled")
p4.plot(sin(linspace(0, 2pi, 1000)), cos(linspace(0, 2pi, 1000)))
p4.showGrid()                   # defaults x=true, y=true

p5 = addPlot(win, title="Scatter plot, axis labels, log scale")
x = 1e-5 * rand(1000)
y = x*1000 .+ 0.005 * randn(1000)
y -= minimum(y).-1.0
mask = x .> 1e-15
x = x[mask]
y = y[mask]
p5.plot(x, y, pen=nothing, symbol="t", symbolPen=nothing, symbolSize=10, symbolBrush=(100, 100, 255, 50))
p5.setLabel("left", text="Y Axis", units="A")
p5.setLabel("bottom", text="Y Axis", units="s")
p5.setLogMode(x=true, y=false)



p6 = addPlot(win, title="Updating plot")

curve = p6.plot(pen="y")
data = randn(10000, 10)
ptr = 0
function update()
    global curve, data, ptr, p6
    qinvoke(curve, :setData, 1:10_000, data[:, 1 + ptr]) # had to fix this
    if ptr == 0
        p6.enableAutoRange("xy", false)  ## stop auto-scaling after the first data set is plotted
    end
    ptr = (ptr + 1) % 10
end


timer = QtCore[:QTimer]()
qconnect(timer, :timeout, update)
qinvoke(timer, :start, 50)


nextRow(win)


p7 = addPlot(win, title="Filled plot, axis disabled")
y = sin(linspace(0.0, 10, 1000)) .+ randn(1000)*0.1
p7.plot(y, fillLevel=-0.3, brush=(50,50,200,100))
p7.showAxis("bottom", show=false)



p8 = addPlot(win, title="Region Selection")

x2 = linspace(-100, 100, 1000)
data2 = sin(x2) ./ x2
p8.plot(data2, pen=(255,255,255,200))

## no special functions for LinearRegionItem
lr = pyqtgraph.(:LinearRegionItem)([400,700])
qinvoke(lr, :setZValue, -10)
p8.addItem(lr)

p9 = addPlot(win, title="zoom")
p9.plot(data2)

function updatePlot()
    p9.setXRange(lr[:getRegion]()..., padding=0)
end
function updateRegion()
    view_range = qinvoke(p9, [:getViewBox, :viewRange]) # 2x2 array
    x_range = Int[view_range[1,j] for j in 1:2]         # a vector, not just view_range[1,:]'
    lr[:setRegion](x_range)
end
qconnect(lr, :sigRegionChanged, updatePlot)
#qconnect(p9, :sigXRangeChanged, updateRegion) ## this is giving issues. Find out why.
updatePlot()

 #raise(w)

PySide.app[:exec_]()
```