我有一个名为 mycode.jl 的文件,其中包含从此处获取的以下代码。
using MultivariateStats, RDatasets, Plots
# load iris dataset
println("loading iris dataset:")
iris = dataset("datasets", "iris")
println(iris)
println("loaded; splitting dataset: ")
# split half to training set
Xtr = Matrix(iris[1:2:end,1:4])'
Xtr_labels = Vector(iris[1:2:end,5])
# split other half to testing set
Xte = Matrix(iris[2:2:end,1:4])'
Xte_labels = Vector(iris[2:2:end,5])
print("split; Performing PCA: ")
# Suppose Xtr and Xte are training and testing data matrix, with each observation in a column. We train a PCA model, allowing up to 3 dimensions:
M = fit(PCA, Xtr; maxoutdim=3)
println(M)
# Then, apply PCA model to the testing set
Yte = predict(M, Xte)
println(Yte)
# And, reconstruct testing observations (approximately) to the original space
Xr = reconstruct(M, Yte)
println(Xr)
# Now, we group results by testing set labels for color coding and visualize first 3 principal components in 3D plot
println("Plotting fn:")
setosa = Yte[:,Xte_labels.=="setosa"]
versicolor = Yte[:,Xte_labels.=="versicolor"]
virginica = Yte[:,Xte_labels.=="virginica"]
p = scatter(setosa[1,:],setosa[2,:],setosa[3,:],marker=:circle,linewidth=0)
scatter!(versicolor[1,:],versicolor[2,:],versicolor[3,:],marker=:circle,linewidth=0)
scatter!(virginica[1,:],virginica[2,:],virginica[3,:],marker=:circle,linewidth=0)
plot!(p,xlabel="PC1",ylabel="PC2",zlabel="PC3")
println("Reached end of program.")
Run Code Online (Sandbox Code Playgroud)
我在 Linux 终端上使用命令运行上面的代码:julia mycode.jl
代码运行正常并到达末尾,但绘图没有出现。
问题出在哪里以及如何解决。
正如绘图文档的输出部分所述:
绘图仅在返回时显示(分号将抑制返回),或者使用 display(plt)、gui() 显式显示,或通过在绘图命令中添加 show = true 来显示。
您可以通过设置默认值来获得类似 MATLAB 的交互行为:default(show = true)
关于“返回时”的第一部分是关于您何时plot从 REPL(或 Jupyter 等)调用的,这里不适用。
在这里,您可以使用其他选项之一:
display(p)最后一次调用后调用plot!(这是最常见的方法)gui()最后一次之后打电话plot!show = true在最后一次plot!调用中添加参数Plots.default(show = true)绘图其中任何一项都足以使绘图窗口出现。
当 Julia 进程结束时,情节结束,如果发生得太快,您可以:
julia -i mycode.jl- 这将运行您的代码,显示绘图,然后将您带到 Julia REPL。这既可以使绘图保持打开状态,又可以让您在需要时进一步使用代码中的变量。readline()在程序末尾添加一个调用。这将使 Julia 等待额外按下换行符/Enter/Return 键,并且绘图将一直显示,直到您按下该键。(这些建议归功于Julia Discourse 上的 ffevotte 。)