『プログラミング言語 Julia でグラフを描画する』 でとりあえずサンプルを動かすことに成功したが、自分の(Julia言語の)プログラムで作ったデータを使ってグラフを描画するにはどうしたら良いかを調べることにした。
今回は『「おっぱい曲面」で学ぶ「Julia言語の実用テクニック」』を参考にして、3D空間に「おっぱい曲面」を描画するサンプルを作ってみた。
例によって、Julia で求めた計算結果を PyQtGraph でグラフ表示するようになっている。(環境を作って是非動かしてみてください)
- Oppai.jl (Julia のソースコード)は、Python のソース内の graph_run() という関数に配列を渡す。グラフの描画は Python にお任せ。。
- Oppai.py (Python のソースコード)では、Julia から渡された配列を基に3Dグラフを描画する(51個の折れ線グラフ)。
- PyCall を用いて Python のコードを呼び出す際には、C:\julia-0.2.1-win32\bin がロードパスに含まれるので、Oppai.jl および Oppai.py の両方共を C:\julia-0.2.1-win32\bin 配下に保存しておくこと。
- ソースコードを保存する際には文字エンコーディングは utf-8 にしておくこと。
- サンプルを起動するには、Oppai.jl (Julia のソースコード) をエクスプローラーからダブルクリックする。
注記:環境構築については、『プログラミング言語 Julia でグラフを描画する』 を参照してください。
↑マウスでドラッグしたりカーソルキーを押すと3Dグラフが回転します。マウスホイールを回すと拡大・縮小ができます。
Oppai.jl(C:\julia-0.2.1-win32\binに保存すること)
# -*- coding: utf-8 -*-
function bust(x,y)
1/8* (6*exp(-((2/3*abs(x) - 1)^2 + (2/3 *y)^2) - 1/3*(2/3*y + 1/2)^3)+ 2/3 *exp(-2.818^11*((abs(2/3*x) - 1)^2+ (2/3 *y)^2)^2) + 2/3*y - (2/3*x)^4)
end
nx = 100
ny = 51
x = linspace(-3, 3, nx)
y = linspace(-3, 3, ny)
z = zeros(Float64, length(y), length(x))
for iy = 1:length(y)
for ix = 1:length(x)
z[iy, ix] = bust(x[ix], y[iy])
end
end
using PyCall
@pyimport Oppai
Oppai.graph_run(x, y, z, 10)
Oppai.py(C:\julia-0.2.1-win32\binに保存すること)
# -*- coding: utf-8 -*-
from pyqtgraph.Qt import QtCore, QtGui
import pyqtgraph.opengl as gl
import pyqtgraph as pg
import numpy as np
def graph_run(plot_data_x, plot_data_y, plot_data_z, distance):
app = QtGui.QApplication([])
w = gl.GLViewWidget()
w.resize(600,400)
w.opts['distance'] = distance
w.show()
w.setWindowTitle(u'Julia+PyQtGraph サンプル')
x = plot_data_x
y = plot_data_y
for i in range(len(y)):
yi = [y[i]]*len(x)
z = plot_data_z[i,:]
pts = np.vstack([x,yi,z]).transpose()
plt = gl.GLLinePlotItem(pos=pts, color=pg.glColor((i,len(y)*1.3)), width=(i+1)/10., antialias=True)
w.addItem(plt)
app.exec_()