7

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

grid = [ [ix*0.01 iy*0.01] for ix=1:100, iy=1:100 ]
grid = vcat(ps...)

centers = hexGrid( 2, 0.2 )

using Plots
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 ))

问题是地块堆积。这是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 ))

但是,我仍然担心一些垃圾(以前的数字)会留在内存中,并且在我运行脚本 100 倍后 Julia 会崩溃。因此,我想在每次运行脚本时调用一些函数,如clear(), flush(), closeAll()... 或其他...

4

2 回答 2

3

删除!具有您想要的效果 - 如果您scatter再次调用,情节就消失了,并且它不在后台的某个地方。

如果您愿意,您可以将绘图存储在变量中并“为了安全”将其覆盖,即

p = scatter(...)
scatter!(p, ...)

...你的阴谋论点在哪里。这将显式覆盖p每个include.

于 2019-10-16T15:42:08.553 回答
2

这是对 crstnbr 出色答案的长评论。如果您想制作一个新图,但它与前一个图有相似之处,您可以在我命名为 的函数中定义一个“画布”(因为需要更好的词)new_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)

在此处输入图像描述

p = new_plot()
plot!(p, x -> 2^x, 0, 1)
plot!(p, x -> 3^x, 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
于 2021-04-28T23:31:50.543 回答