Pluto 踩坑记

本贴主要记录本人使用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的坑,比如执行顺序等。

推荐一个黑色系主题:GitHub - Pocket-titan/DarkMode: Dark mode for Pluto 🎉

1 个赞

回来填坑:

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 个赞

您好。请问jupyter能交互么?
(pluto试了下,感觉很别扭。比如连树状目录图都没有。)

当然可以。jupyter = Ju-Py-te-R

在线版


推荐

难上手,但上限高。

已经把julia内核配置到jupyter中。
官方说glmakie可以交互。我在jupyter试了下glmakie,还没交互成功。
https://juliadatascience.io/glmakie

你是论坛里的小能手! :grinning:

This is where GLMakie.jl might be helpful, since it uses OpenGL as a backend that adds interactivity and responsiveness to plots.

这句?

没有试过,我猜是指如果画 3D 图,生成的图能旋转。
我理解的能交互是,能修改参数然后动态更新。

不知道是不是在jupyter中需要什么魔法语句,直接绘制出来的三维图不能转动交互。

给新手带来的小困难还真不少。