【问题标题】:Using plot within a script in julia在朱莉娅的脚本中使用情节
【发布时间】:2019-05-22 02:18:16
【问题描述】:

我一直在 Jupyter 笔记本中对一些 julia 代码进行原型设计,但它已超出笔记本格式,我想将其放入脚本中以便正确组织它。但是,我不知道如何让 Plots 在脚本中工作,也找不到任何关于它的文档。

这是一个最小的不工作示例:

using Plots
gr()
display(plot([1,3,2]))
println("here")

此代码需要 20-30 秒来导入 Plots,然后打开一个窗口但又立即将其关闭,打印“here”,然后退出。导入过程中我无法使用 ctrl-C。

所以,我有三个问题:

  • 如何防止绘图窗口一打开就关闭?我想要的是让脚本阻止或(理想情况下)进入事件循环,直到窗口关闭,然后终止。

  • 能否以某种方式减少极长的导入时间?

  • 是否有任何文档可用于在 Jupyter 环境之外使用 Plot?

如果有什么不同,我在 Mac 上使用 julia 1.1.1。

【问题讨论】:

  • 我猜你在一个文件中有上面的代码,比如script.jl,并且正在调用$ julia script.jl。似乎绘图 GUI 仅在 julia 进程运行时保持打开状态。一旦进程到达脚本的末尾,进程就会终止并且您会丢失 GUI。我认为你必须要么使用savefig 将你的绘图保存到一个文件中,要么通过 REPL、Juno 或 VS Code 以交互方式工作。
  • Plots.jl 的加载时间长通常令人遗憾。 :)
  • 关于你的第三点,你不应该做任何特别的事情来使用 Plots.jl 从 REPL、Juno 或 VS 代码交互地进行绘图。
  • @clbieganek 对于第一点,我进行了编辑以更清楚地了解我想要的内容。我希望复制我当前的 Python 工作流程,我的脚本在其中进行一些计算,然后弹出一个显示结果的窗口,直到我关闭它。如果这个工作流程不可行,那么遗憾的是,Julia 目前对我来说不是正确的解决方案。 (我不想在 notebook/REPL 中运行所有内容,因为这可能会导致可重复性的细微问题。)
  • 可重复性是一个非常合理的问题。为了解决这个问题,您可以考虑将代码编写为 Julia 包并包含单元测试。 Julian 风格是编写许多非常短的函数(“单一职责原则”)。而且函数越小,为这些函数添加单元测试就越容易。

标签: julia plots.jl


【解决方案1】:

实现您在第一个项目符号中寻找的工作流程的最自然方法是使用 Juno 或 VS Code。假设在您的工作目录中,文件script.jl 中有以下代码:

using Plots
gr()
display(plot([1,3,2]))

hello = "world"

println("here")

现在启动 Juno 或 VS Code 并启动集成的 Julia REPL。从 Julia REPL,您可以使用 include 获取脚本:

julia> include("script.jl")
Plot{Plots.GRBackend() n=1}
here

现在您的脚本已经完全运行,并且可以在绘图窗格中查看绘图(Juno 和 VS Code 都是如此)。现在您可以继续include REPL 中的其他文件或以交互方式运行其他代码。请注意,script.jl 中定义的变量可供使用:

julia> hello
"world"

编辑:

如果您使用-i 选项(用于交互式)运行脚本,绘图 GUI 将保持打开状态,并且在脚本运行完成后启动 REPL:

$ julia -i script.jl

Julia 可执行文件的各种选项可以是found here,也可以通过在终端中输入$ julia --help 找到。

【讨论】:

    【解决方案2】:

    可以通过提前编译 Plots.jl 包并使用 PackageCompiler.jl 包将其烘焙到您的 julia 可执行文件中来消除导入时间。这是包网站的链接

    https://julialang.github.io/PackageCompiler.jl/dev/

    请参阅教程了解如何执行此操作,第一个教程是关于编译语法高亮包。那个替换您的默认“系统映像”。第二个教程是关于在编译 Plots.jl 的地方创建一个可加载的“sysimage”,并使用这个“sysimage”启动 Julia,这样它就不必再次编译 Plots.jl。

    但是我无法让第二个“可加载系统映像”正常工作,所以我使用第一个教程的方式,即使是 Plots.jl。

    在这个改变之后,使用 Plots 和 plot() 基本上是即时的。

    【讨论】:

      猜你喜欢
      • 2022-12-23
      • 1970-01-01
      • 2018-11-27
      • 1970-01-01
      • 2014-04-26
      • 1970-01-01
      • 1970-01-01
      • 2014-12-31
      • 1970-01-01
      相关资源
      最近更新 更多