Julia:"Plot not defined" 尝试添加滑块时

Julia: "Plot not defined" when attempting to add slider bars

我正在学习如何使用滑块创建绘图。这是我的代码基于 this tutorial

的第一个例子
using Plots
gr()
using GLMakie

function plotLaneEmden(log_delta_xi=-4, n=3)
  fig = Figure()
  
  ax = Axis(fig[1, 1])
  
  sl_x = Slider(fig[2, 1], range = 0:0.01:4.99, startvalue = 3)
  sl_y = Slider(fig[1, 2], range = -6:0.01:0.1, horizontal = false, startvalue = -2)
  
  point = lift(sl_x.value, sl_y.value) do n, log_delta_xi
      Point2f(n, log_delta_xi)
  end
  
  plot(n,  1 .- log_delta_xi.^2/6,  linecolor = :green, label="n = $n")
  
  xlabel!("ξ")
  ylabel!("θ")
end

plotLaneEmden()

当我运行这个时,它给出UndefVarError: plot not defined。我在这里错过了什么?

您似乎在尝试混合搭配 Plots.jl 和 Makie.jl。具体来说,您 link 中的示例完全适用于 Makie(具体来说,使用 GLMakie 后端),而您尝试添加的 plot 函数使用特定于 Plots.jl 版本的语法plot(具体包括 linecolorlabel 关键字参数)。

Plots.jl 和 Makie.jl 是两个独立且不相关的绘图库,因此您必须选择一个并坚持使用它。由于两个库都导出了一些相同的函数名称,因此同时使用两者会导致歧义,如果不消除歧义,则 UndefVarErrors。

另一个潜在的问题是,您似乎正在尝试仅使用单个 x 和 y 值绘制线图(nlog_delta_xi 在您的代码中都是单个数字,因为书面)。如果那是你想要的,你需要一个散点图而不是线图;如果这不是您想要的,您需要以某种方式制作这些变量向量。

根据您的具体需要,您可以尝试更多的方法(在新会话中,using 仅 Makie 而不是 Plots):

using GLMakie

function plotLaneEmden(log_delta_xi=-4, n=3)
  fig = Figure()
  
  ax = Axis(fig[1, 1], xlabel="ξ", ylabel="θ")
  
  sl_x = Slider(fig[2, 1], range = 0:0.01:4.99, startvalue = n)
  sl_y = Slider(fig[1, 2], range = -6:0.01:0.1, horizontal = false, startvalue = log_delta_xi)
  
  point = lift(sl_x.value, sl_y.value) do n, log_delta_xi
      Point2f(n, 1 - log_delta_xi^2/6)
  end
  
  sca = scatter!(point,  color = :green, markersize = 20)
  
  axislegend(ax, [sca], ["n = $n"])  
  fig
end

plotLaneEmden()

或者,下面是一个交互式绘制线而不是点的简单示例:

using GLMakie

function quadraticsliders(x=-5:0.01:5)
  fig = Figure()

  ax = Axis(fig[1, 1], xlabel="X", ylabel="Y")

  sl_a = Slider(fig[2, 1], range = -3:0.01:3, startvalue = 0.)
  sl_b = Slider(fig[1, 2], range = -3:0.01:3, horizontal = false, startvalue = 0.)

  points = lift(sl_a.value, sl_b.value) do a, b
      Point2f.(x, a.*x.^2 .+ b.*x)
  end

  l = lines!(points, color = :blue)

  onany((a,b)->axislegend(ax, [l], ["$(a)x² + $(b)x"]), sl_a.value, sl_b.value)

  limits!(ax, minimum(x), maximum(x), -10, 10)

  fig
end

quadraticsliders()

预计到达时间:几个例子更接近您可能正在寻找的内容