プログラミング言語の Julia でグラフを描画する環境を構築してみました。PySide パッケージ を追加しています。
文末に掲載したグラフを表示するサンプルプログラムは Julia の PySide パッケージ に添付されているものに一部修正を加えたものです(最後の行に PySide.app[:exec_]()
を加えました)。
(尚、バグとかご意見ありましたら https://twitter.com/akmiyoshi までお願いします)
Windows 7 上での環境構築の手順を
(後で)掲載したいと思います記載しました。
興味のある方はストックをお願いします。
筆者の環境は Windows 7 Home Premium 64bit ですが、環境構築はすべて32bit版のプログラムをインストールしました。
この手順に従えば Windows OS (XP SP2以降) の 32bit 版および 64bit 版の両方で動作すると思います。
【追記】2014/07/04 に手順 4, 6, 11 を追加しました。2014/07/04 以前にこの記事を見て環境を構築した方は手順 4, 6, 11 を実行してください。よろしくお願いします。
##1. Python 2.7.7 (32bit)をインストールする。
- https://www.python.org/download/ から Python 2.7.7 Windows Installer をダウンロードする。(X86-64 Installer ではないので注意)
- python-2.7.7.msi を起動してインストール。デフォルトの C:\Python27 にインストールする。 「Add python.exe to Path」を有効にしておく (デフォルトでは無効になっています)。
##2. numpy (32bit)をインストールする。
- http://sourceforge.net/projects/numpy/files/NumPy/1.8.1/ から numpy-1.8.1-win32-superpack-python2.7.exe をダウンロードする。
- 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 をダウンロードする。
- 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 をダウンロードする。
- 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 という名前で保存する)
- コマンドプロンプト(「スタートボタン」⇒「すべてのプログラム」⇒「アクセサリ」⇒「コマンドプロンプト」)を起動以下のように
python からget-pip.py を起動する。(「c:\get-pip.py」は C ドライブ直下に get-pip.py を保存した場合の例)
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」を実行する。
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」を実行する。
C:\Users\root>cd \Python27\Scripts
C:\Python27\Scripts>pip install -U PySide
##8. PyOpenGL をインストールする。
- コマンドプロンプトを起動して、カレントディレクトリを「C:\Python27\Scripts」に変更後「pip install -U PyOpenGL」を実行する。
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 をダウンロードする。
- 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 をダウンロードする。
- 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")」を実行する。
julia> Pkg.add("PyPlot")
##12. Julia に PySide パッケージを追加する。
- julia.bat へのショートカットをダブルクリックして Julia のインタプリタを起動する。
- 「Pkg.add("PySide")」を実行する。
julia> Pkg.add("PySide")
##13. サンプルプログラムを実行する。
- 文末のソースコード(pyqtgraph.jl)を「pyqtgraph.jl」というファイル名で任意のディレクトリに保存。
- 保存した「pyqtgraph.jl」をダブルクリックする。「インストールされたプログラムの一覧からプログラムを選択する」を選んで「OK」をクリックする。次に「参照」を押して「C:\julia-0.2.1-win32\julia.bat」を選択して「開く」をクリックする。(拡張子「.jl」に対して「julia.bat」を関連付ける)
- 上記の(9つのグラフの)画面が表示されれば成功。
## 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_]()