在 ssh 服务器上的 PlotlyJS

PlotlyJS while on ssh server

我正在使用我的实验室 SSH 服务器,并且想在 Julia 中使用 PlotlyJS。但是,以下最少的代码不起作用,我不知道也没有足够的知识来确定原因。

julia> using PlotlyJS
julia> plot(1:5)  
Error showing value of type PlotlyJS.SyncPlot:  
ERROR: IOError: connect: connection refused (ECONNREFUSED)  
Stacktrace:  
 [1] wait_connected(::Sockets.TCPSocket) at /build/julia-CrxBG0/julia-1.5.3+dfsg/usr/share/julia/stdlib/v1.5/Sockets/src/Sockets.jl:525  
 [2] connect at /build/julia-CrxBG0/julia-1.5.3+dfsg/usr/share/julia/stdlib/v1.5/Sockets/src/Sockets.jl:560 [inlined]  
 [3] connect(::Sockets.IPv4, ::Int64) at /build/julia-CrxBG0/julia-1.5.3+dfsg/usr/share/julia/stdlib/v1.5/Sockets/src/Sockets.jl:546  
 [4] try_connect(::Sockets.IPv4, ::Vararg{Any,N} where N; interval::Float64, attempts::Int64) at /home/MYLAB/MYNAME/.julia/packages/Blink/mwJC9/src/AtomShell/process.jl:79  
 [5] try_connect at /home/MYLAB/MYNAME/.julia/packages/Blink/mwJC9/src/AtomShell/process.jl:77 [inlined]  
 [6] init(; debug::Bool) at /home/MYLAB/MYNAME/.julia/packages/Blink/mwJC9/src/AtomShell/process.jl:93  
 [7] shell(; debug::Bool) at /home/MYLAB/MYNAME/.julia/packages/Blink/mwJC9/src/AtomShell/process.jl:149  
 [8] shell at /home/MYLAB/MYNAME/.julia/packages/Blink/mwJC9/src/AtomShell/process.jl:144 [inlined]  
 [9] #Window#14 at /home/MYLAB/MYNAME/.julia/packages/Blink/mwJC9/src/AtomShell/window.jl:89 [inlined]  
 [10] Blink.AtomShell.Window(::Dict{String,Int64}) at /home/MYLAB/MYNAME/.julia/packages/Blink/mwJC9/src/AtomShell/window.jl:89  
 [11] display_blink(::PlotlyJS.SyncPlot) at /home/MYLAB/MYNAME/.julia/packages/PlotlyJS/4jzLr/src/display.jl:169  
 [12] display(::PlotlyJS.PlotlyJSDisplay, ::PlotlyJS.SyncPlot) at /home/MYLAB/MYNAME/.julia/packages/PlotlyJS/4jzLr/src/display.jl:160  
 [13] display(::Any) at ./multimedia.jl:328  
 [14] #invokelatest#1 at ./essentials.jl:710 [inlined]  
 [15] invokelatest at ./essentials.jl:709 [inlined]  
 [16] print_response(::IO, ::Any, ::Bool, ::Bool, ::Any) at /build/julia-CrxBG0/julia-1.5.3+dfsg/usr/share/julia/stdlib/v1.5/REPL/src/REPL.jl:238  
 [17] print_response(::REPL.AbstractREPL, ::Any, ::Bool, ::Bool) at /build/julia-CrxBG0/julia-1.5.3+dfsg/usr/share/julia/stdlib/v1.5/REPL/src/REPL.jl:223  
 [18] (::REPL.var"#do_respond#54"{Bool,Bool,REPL.var"#64#73"{REPL.LineEditREPL,REPL.REPLHistoryProvider},REPL.LineEditREPL,REPL.LineEdit.Prompt})(::Any, ::Any, ::Any) at /build/julia-CrxBG0/julia-1.5.3+dfsg/usr/share/julia/stdlib/v1.5/REPL/src/REPL.jl:822  
 [19] #invokelatest#1 at ./essentials.jl:710 [inlined]  
 [20] invokelatest at ./essentials.jl:709 [inlined]  
 [21] run_interface(::REPL.Terminals.TextTerminal, ::REPL.LineEdit.ModalInterface, ::REPL.LineEdit.MIState) at /build/julia-CrxBG0/julia-1.5.3+dfsg/usr/share/julia/stdlib/v1.5/REPL/src/LineEdit.jl:2355  
 [22] run_frontend(::REPL.LineEditREPL, ::REPL.REPLBackendRef) at /build/julia-CrxBG0/julia-1.5.3+dfsg/usr/share/julia/stdlib/v1.5/REPL/src/REPL.jl:1144  
 [23] (::REPL.var"#38#42"{REPL.LineEditREPL,REPL.REPLBackendRef})() at ./task.jl:356  

嗯,SSH 不会自动将图形界面转发到您的本地计算机。因此 PlotlyJS 试图打开一个图形界面,但它失败了,因为它不能那样做。您需要在连接到服务器时启用 X11Forwarding,并且需要服务器允许。 使用 linux 机器,命令通常是

ssh -X username@server.org

其中 -X 选项用于端口转发。可以找到有关如何使用 X11Forwading 的指南 here

也就是说,我建议您使用 Julia 的 Plots 包而不是后端包 PlotlyJS 来处理绘图,因为它具有更多功能并且对用户更友好。您可以使用 PlotlyJS 后端:

using Plots
plotlyjs()

如果您使用 Plots 请小心,因为并非所有后端都支持这种转发,例如 GR 不起作用。

最后,我真的不鼓励你从服务器绘制到你的本地机器,因为它真的很慢而且在我看来没有多大意义。

另一种可能是抑制绘图的显示以保存绘图并将其复制到本地计算机然后打开它。这是通过分号 ; 完成的,因为图仅在返回时显示。 因此:

using Plots #(or PlotlyJS as you wish)
p = plot();
savefig(p, "fig.png")