本贴主要记录本人使用Pluto以来踩过的坑,欢迎大家补充。
指定 Pluto 笔记本运行环境
一开始我想当然以为建一个环境并在该环境下开Pluto,就可以让笔记本在该环境运行,但事实并非如此。其实这个在 Jupyter 也是同样道理。
按照 Pluto sample 里的说法,以后可能会让笔记本自带环境定义,目前可以使用诸如
env = mktempdir()
import Pkg
Pkg.activate(env)
Pkg.Registry.update()
Pkg.add(["Pkg1", "Pkg2" ])
使用 Makie
Plots.jl 绘制 3d 图的效果不及 Makie 来的好。
在 Pluto 里绘图如果使用 Makie,需要使用 WGLMakie 后端,即
using AbstractPlotting, WGLMakie
目前我主要遇到两个问题。
ip 问题
在本地运行时,来自 Makie 的图会指向 ip 0.0.0.0
(参见 #60 ),使得浏览器无法正确加载绘图结果。
目前的解决方案是在绘图前修改 JSServe 的ip设置,比如:
JSServe.JSSERVE_CONFIGURATION.listen_url[] = "127.0.0.1"
使用 Observable
Makie 提供了基于 Observable.jl 的交互绘图,Pluto 也提供了一个类似的基于 Javascript 的交互工具,目前两者协调的不太好,联合使用起来会让代码很别扭。
(待补充例子)
4 个赞
请问楼主是在哪个平台使用的Pluto和Makie?有遇到过设置或者环境不同的问题吗?我之前的体验中Makie对于Mac的支持相当不好(当然可能是没有独显的原因)。
我目前在Windows上,不过WGLMakie对系统应该不敏感,对浏览器敏感。你应该用的是默认的GLMakie后端,使用体验应该会依赖平台上OpenGL的支持情况。我手上没有Mac,详细的我不太清楚。
1 个赞
Pluto 写function时候,好像不能对函数内定义的变量进行Tab补全。
功能完善还要不少时间,不过Pluto的思路确实避开了很多Jupyter的坑,比如执行顺序等。
回来填坑:
Makie 和 Pluto 都提供了交互功能,但是原理不太一样,用起来各有利弊
方案一:完全基于 Pluto
Pluto 的交互是基于javascript的,浏览器
检测哪些变量会英雄哪些cell,在变量改变时自动重新运行对应cell。这套方案非常万能,也是代码最省事(Julia层面)的交互方案。缺点也很显著,整个cell代码全部重运行,对于Makie十分并不划算,严重影响交互流畅度。
## Cell 1
begin
local as = @bind a PlutoUI.Slider(0:0.1:1)
md"a: $as"
end
## Cell 2
begin
x = 0:0.01*π:2π
y = sin.(x .+ a)
lines(x, y)
end
方案二:完全基于 Makie
Makie 可以监控一个Observable
(或者叫Node
,两者是一个东西,后者是Makie对前者的别名),Observable
变化时Makie可以自动重绘影响的图的部分,无需重新运行整个绘图代码,性能较好。
可惜目前我没能够成功在Pluto上使用Makie提供的控件,而且内存占用会急剧上升。两者兼容性不太好。
代码:
begin
local as = slider(0:0.1:1)
local a = as[end][:value]
local x = 0:0.01*π:2π
local y = @lift sin.(x .+ $a)
hbox(lines(x, y), as)
end
方案三:混合使用 Pluto 和 Makie
既然 Makie 的控件不可用,我们可以考虑让Pluto的控件和Makie监视的Observable
绑定,这样可以获得交互性与性能的平衡(虽然代码丑了些)。
# Cell 1
begin
b = Node(0.)
local x = 0:0.01*π:2π
local y = @lift sin.(x .+ $b)
lines(x, y)
end
#Cell 2
@bind bs PlutoUI.Slider(0:0.1:1)
#Cell3
b[] = bs
总结一下,对性能要求不高,可以考虑方案一,比较使用Observable有很多麻烦的地方(比如lift
)。大多数情况下用方案三,可以把Cell3隐藏,外表看上去更自然一些。方案二目前Pluto上不能用。希望以后Pluto和Makie都能够有更好的发展。
2 个赞
yummy
2022 年1 月 12 日 10:51
8
您好。请问jupyter能交互么?
(pluto试了下,感觉很别扭。比如连树状目录图都没有。)
yummy:
jupyter
当然可以。jupyter = Ju -Py -te-R
在线版
yummy:
交互
推荐
难上手,但上限高。
yummy
2022 年1 月 12 日 11:09
10
已经把julia内核配置到jupyter中。
官方说glmakie可以交互。我在jupyter试了下glmakie,还没交互成功。
https://juliadatascience.io/glmakie
yummy:
官方说glmakie可以交互。
This is where GLMakie.jl
might be helpful, since it uses OpenGL as a backend that adds interactivity and responsiveness to plots.
这句?
没有试过,我猜是指如果画 3D 图,生成的图能旋转。
我理解的能交互是,能修改参数然后动态更新。
yummy
2022 年1 月 12 日 15:41
13
不知道是不是在jupyter中需要什么魔法语句,直接绘制出来的三维图不能转动交互。
给新手带来的小困难还真不少。