眠気.jl

投稿=不定期

Makie.jlで遊んでみる(インストールと画像、動画出力)

動機

Juliaで画像とか動画とか作ってみたかったから

目標

1 test Makieでエラー吐かないようにする
2 画像出力(.jpg)
3 動画出力(.mp4)

作業環境

重いらしいのでゲーミングPCの方でやってみる

julia> versioninfo()
Julia Version 1.1.0
Commit 80516ca202 (2019-01-21 21:24 UTC)
Platform Info:
  OS: Linux (x86_64-pc-linux-gnu)
  CPU: Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-6.0.1 (ORCJIT, skylake)
Environment:
  JULIA_EDITOR = atom -a
  JULIA_NUM_THREADS = 6

ffmpeg等必要なので、次をターミナルで走らせておく

sudo apt-get install ffmpeg cmake xorg-dev

やってみる

julia>
(v1.1) pkg> activate Makie-env
(Makie-env) pkg> add AbstractPlotting Makie GLMakie FileIO CodecZlib GDAL
julia> using Pkg
julia> Pkg.installed()
Dict{String,Union{Nothing, VersionNumber}} with 6 entries:
  "CodecZlib"        => v"0.5.2"
  "FileIO"           => v"1.0.5"
  "Makie"            => v"0.9.3"
  "AbstractPlotting" => v"0.9.6"
  "GDAL"             => v"0.2.0"
  "GLMakie"          => v"0.0.5"
julia> Pkg.build("CodecZlib")
julia> Pkg.build("GDAL")
julia> exit()
Julia has exited. Press Enter to start a new session.
julia>
(v1,1) pkg> activate Makie-env
(Makie-env) > test Makie
...
Test Summary:         | Pass  Total
Reference Image Tests |  185    185
   Testing Makie tests passed
julia> edit("first_scatter.jl")

散布図を書く(first_scatter.jlを編集)
色も配置もランダムにプロットする(チュートリアルそのまま)

using Makie

 x = rand(10)
 y = rand(10)
 colors = rand(10)

 scene = scatter(x, y, color = colors)

 Makie.save("scatterplot.jpg", scene)

REPLに戻って

shell> julia first_scatter.jl
scatterplot.jpg

f:id:julialangisthebestlang:20190312101131j:plain
scatterplot.jpg
できた!
動画もやってみる

julia> edit("video.jl")

video.jlを編集

using Makie

 scene = Scene()

 f(t, v, s) = (sin(v + t) * s, cos(v + t) * s, (cos(v + t) + sin(v)) * s)
 t = Node(Base.time())
 limits = FRect3D(Vec3f0(-1.5, -1.5, -3), Vec3f0(3, 3, 6)) #np.linspace的な、描画する範囲の指定
 p1 = meshscatter!(scene, lift(t-> f.(t, range(0, stop = 2pi, length = 50), 1), t), markersize = 0.1, color = RGBAf0(0.2, 0.9, 0.2, 0.3))[end]
 p2 = meshscatter!(scene, lift(t-> f.(t * 2.0, range(0, stop = 2pi, length = 50), 1.5), t), markersize = 0.1, color = RGBAf0(0.9, 0.2, 0.4, 1))[end]
#RGBAf0でカラー指定してみた
 lines = lift(p1[1], p2[1]) do pos1, pos2
     map((a, b)-> (a, b), pos1, pos2)
 end
 linesegments!(scene, lines, linestyle = :dot, limits = limits)
 N = 150 #動画のコマ数指定
 record(scene, "/置きたいpath/first_video.mp4", 1:N) do i #record関数でmp4出力
     push!(t, Base.time())
end

REPLに戻って

shell> julia first_video
julia>

できた!(.mp4の場合は結果はREPLには出ませんでした)

感想

楽しかった!!
surfaceに矢印をプロットする関数もあるようなので,微分幾何をやり直しつつ,可視化もしてみたいです!!!

参考にしたURL,書籍

Julia Programming Projects: Learn Julia 1.x by building apps for data analysis, visualization, machine learning, and the web (English Edition) Makie.jl公式レポジトリ
Makie.jl公式ドキュメント