LoginSignup
27
36

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-06-29

プログラミング言語の Julia でグラフを描画する環境を構築してみました。PySide パッケージ を追加しています。
文末に掲載したグラフを表示するサンプルプログラムは JuliaPySide パッケージ に添付されているものに一部修正を加えたものです(最後の行に 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 を実行してください。よろしくお願いします。

pyqtgraph.gif

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」を有効にしておく (デフォルトでは無効になっています)。

2014-0701-1224.png

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

3. scipy (32bit)をインストールする。

4. matplotlib をインストールする。(2014/07/04に追加)

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つのグラフの)画面が表示されれば成功。
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_]()
27
36
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
36