Julia 如何在不关闭环境的情况下清理绘图(GR)

Julia 如何在不关闭环境的情况下清理绘图(GR),julia,plots.jl,Julia,Plots.jl,我正在调试一个脚本(它使用Plots.jl和GKS-qterm后端)。所以我多次运行脚本。当我从终端运行它时,比如bash>julia pointPlacement.jl初始化julia和Plots.jl需要很长时间(与python相比,这是一个很大的不便)。因此,我宁愿让Julia打开并从内部运行脚本,比如Julia>include(“pointPlacement.jl”) 问题是,情节不断累积。这是在9次跑步之后。应该只有2个数据集,而不是18个: 我想关闭(杀死、摧毁)他们 如果我删除像

我正在调试一个脚本(它使用
Plots.jl
GKS-qterm
后端)。所以我多次运行脚本。当我从终端运行它时,比如
bash>julia pointPlacement.jl
初始化julia和Plots.jl需要很长时间(与python相比,这是一个很大的不便)。因此,我宁愿让Julia打开并从内部运行脚本,比如
Julia>include(“pointPlacement.jl”)

问题是,情节不断累积。这是在9次跑步之后。应该只有2个数据集,而不是18个:

我想关闭(杀死、摧毁)他们

如果我删除
像这样,它会有帮助

display(scatter( grid[:,1], grid[:,2], markersize = 1, markerstrokewidth = 0, aspect_ratio=:equal ))
display(scatter!( centers[:,1], centers[:,2], markersize = 2, markerstrokewidth = 0, aspect_ratio=:equal ))

但是,我仍然担心一些垃圾(前面的数字)会留在内存中,而Julia会在我运行脚本100x后崩溃。因此,我想调用一些函数,如
clear()
flush()
closeAll()
。。。或者别的什么。。。每次我运行脚本时删除
具有您想要的效果-如果您再次调用
scatter
,并且它不在背景中的某个位置,则绘图将消失

如果需要,可以将绘图存储在变量中,并“为安全起见”覆盖它,即


,其中,
是绘图参数。这将明确覆盖每个
include

上的
p
,这是对crstnbr极好答案的一个长篇评论。如果您想创建一个新的绘图,但它与前一个绘图有相似之处,那么您可以在一个函数中定义一个“画布”(因为缺少更好的单词),我将其命名为
new\u plot()
,并重用画布。如果您有长标签和标题,但不希望在打印之间复制,则这一点特别有用:

using Plots

function new_plot()
    plot(xlabel = "x", ylabel = "f(x)",
        xlims = (0,Inf), ylims = (-Inf, 1))
end 

p = new_plot()
plot!(p, x -> x^2, 0, 1)
plot!(p, x -> x^3, 0, 1)

编辑:不再与OP直接相关,但请注意,正如Benoît Pasquier在评论中指出的,您可以使用以下选项设置默认选项:

default(xlabel = "x", ylabel = "f(x)", 
        xlims = (0,:auto), ylims = (:auto, 1))
但是您仍然需要创建一个新的绘图来“覆盖”上一个绘图,正如crstnbr所解释的那样。考虑这一点:

using Plots
p = plot()
for i in 1:5
    plot!(p, x -> x^i, 0, 1)
end
什么都没发生?现在试试这个:

p  # after a loop, you must call the plot object to display it

顺便说一句,我认为那些
display
调用是不必要的,不是吗?是的,它们是。。。只是我在一些教程中看到了它们,所以我在尝试它是否有帮助。我怀疑内存没有被清理的原因是GR有时会崩溃,错误消息是
打开了许多文件(或
打开了许多实例),而不是
断了管道(我现在无法重现,也记不起确切的消息)。所以我认为这是相关的。但这可能还有其他原因-我有两个Julia运行的实例(一个在bash终端中
vscode
内,另一个在单独的bash终端中,我尝试简单的sniples)。两者都在GR中使用Pyplot,我发现存在串扰(因为当它崩溃时,错误出现在另一个终端上,然后出现在我调用最后一个plot函数的终端上),那么,对这些关键字参数使用
NamedTuple
?例如,首先创建
options=(xlabel=“x”,ylabel=“f(x)”,xlims=(0,Inf),ylims=(-Inf,1))
,然后您可以简单地使用
p=plot(x->x^2,0,1;options…
。如果始终使用相同的默认属性,还有
默认值(xlabel=“x”,ylabel=“f(x)”,xlims=(0,:auto),ylims=(:auto,1))
,然后甚至不需要键入任何内容!:)啊,很抱歉,我将那些
Inf
更改为
:auto
,用于我的本地测试,但是我认为
:auto
应该可以工作。您使用的是Plots.jl的哪个版本?(我在v1.13.2,GR_jll v0.57.2+0)您可能有一个保留依赖项的tehr包。您可以尝试
pkg>添加Plots@v1.13.2
并调查阻止更新的原因。我要做的是确保我的默认环境是最小的,并且只有我一直在使用的东西(绘图就是其中之一),然后总是
pkg>activate--temp
,为任何MWE启动一个新的环境。嗨,贝诺!谢谢你说得对,我有一个包裹,里面装着
绘图。诊断起来并不容易。我删除了我的
.julia
目录并重新安装了我的软件包,但我仍然坚持使用旧版本!幸运的是,运行
Pkg.Pkg“addplots#master”
帮助我识别出把事情搞砸的包。谢谢你的帮助!现在
:auto
工作了。酷把戏!
default(xlabel = "x", ylabel = "f(x)", 
        xlims = (0,:auto), ylims = (:auto, 1))
using Plots
p = plot()
for i in 1:5
    plot!(p, x -> x^i, 0, 1)
end
p  # after a loop, you must call the plot object to display it