代码之家  ›  专栏  ›  技术社区  ›  AaronJPung

将PlotlyJS plot保存为PNG(Julia)

  •  0
  • AaronJPung  · 技术社区  · 2 年前

    我想使用Julia将PlotlyJS绘图保存为PNG,但我不知道如何保存。这个 PlotlyJS webpage for Julia 声明“要保存图表以供外部查看,可以使用savefig(p,filename::String)方法”。但是,以下代码:

    using PlotlyJS
    
    p = plot(rand(10, 4))
    PlotlyJS.savefig(p, filename="myimage.png")
    

    由于“获取了不受支持的关键字参数”文件名而导致错误,但使用

    PlotlyJS.savefig(p, "myimage.png")
    

    导致“访问未定义引用”错误:

    ERROR: UndefRefError: access to undefined reference
    Stacktrace:
      [1] getproperty
        @ .\Base.jl:42 [inlined]
      [2] _kaleido_running
        @ C:\Users\apung\.julia\packages\PlotlyBase\NxSlF\src\kaleido.jl:176 [inlined]
      [3] _ensure_kaleido_running()
        @ PlotlyBase C:\Users\apung\.julia\packages\PlotlyBase\NxSlF\src\kaleido.jl:177
      [4] savefig(p::Plot{Vector{GenericTrace}, Layout{Dict{Symbol, Any}}, Vector{PlotlyFrame}}; width::Nothing, height::Nothing, scale::Nothing, format::String)
        @ PlotlyBase C:\Users\apung\.julia\packages\PlotlyBase\NxSlF\src\kaleido.jl:84
      [5] savefig(io::IOStream, p::Plot{Vector{GenericTrace}, Layout{Dict{Symbol, Any}}, Vector{PlotlyFrame}}; width::Nothing, height::Nothing, scale::Nothing, format::String)
        @ PlotlyBase C:\Users\apung\.julia\packages\PlotlyBase\NxSlF\src\kaleido.jl:139
      [6] (::PlotlyBase.var"#181#182"{Nothing, Nothing, Nothing, Plot{Vector{GenericTrace}, Layout{Dict{Symbol, Any}}, Vector{PlotlyFrame}}})(f::IOStream)
        @ PlotlyBase C:\Users\apung\.julia\packages\PlotlyBase\NxSlF\src\kaleido.jl:171
      [7] open(::PlotlyBase.var"#181#182"{Nothing, Nothing, Nothing, Plot{Vector{GenericTrace}, Layout{Dict{Symbol, Any}}, Vector{PlotlyFrame}}}, ::String, ::Vararg{String}; kwargs::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
        @ Base .\io.jl:330
      [8] open
        @ .\io.jl:328 [inlined]
      [9] savefig(p::Plot{Vector{GenericTrace}, Layout{Dict{Symbol, Any}}, Vector{PlotlyFrame}}, fn::String; format::Nothing, width::Nothing, height::Nothing, scale::Nothing)
        @ PlotlyBase C:\Users\apung\.julia\packages\PlotlyBase\NxSlF\src\kaleido.jl:170
     [10] savefig(p::Plot{Vector{GenericTrace}, Layout{Dict{Symbol, Any}}, Vector{PlotlyFrame}}, fn::String)
        @ PlotlyBase C:\Users\apung\.julia\packages\PlotlyBase\NxSlF\src\kaleido.jl:165
     [11] savefig(p::PlotlyJS.SyncPlot, a::String; k::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
        @ PlotlyJS C:\Users\apung\.julia\packages\PlotlyJS\WF333\src\PlotlyJS.jl:49
     [12] savefig(p::PlotlyJS.SyncPlot, a::String)
        @ PlotlyJS C:\Users\apung\.julia\packages\PlotlyJS\WF333\src\PlotlyJS.jl:49
     [13] top-level scope
        @ none:1
    

    我还尝试过定义PyPlot图形,并通过PyPlot打开/保存图像,但没有成功。

    或者,基于 this 接受答案,我可以将绘图保存为HTML文件,但我仍然需要将HTML文件转换或保存为PNG。提出了解决这个问题的办法 here ,但这仍然让人感觉混乱。

    最后,我想将PlotlyJS绘图保存为PNG文件。

    0 回复  |  直到 2 年前
        1
  •  1
  •   Nils Gudat    2 年前

    正如奥斯卡在评论中所说,你在当前稳定发布的PlotlyJS 0.18.8上的第二次尝试应该没有问题。

    julia> using PlotlyJS
    
    julia> savefig(plot(rand(10)), "test.png")
    

    结果是一个png文件被写入我当前的工作目录。

    你第一次试图通过 filename 关键字不起作用,因为正如错误所说,这个关键字不存在。使用REPL help模式查看函数的方法签名很有用(可按访问) ? ):

    help?> savefig
    search: savefig StackOverflowError
    
    (...)
    
      savefig(
          p::Plot, fn::AbstractString;
          format::Union{Nothing,String}=nothing,
          width::Union{Nothing,Int}=nothing,
          height::Union{Nothing,Int}=nothing,
          scale::Union{Nothing,Real}=nothing,
      )
    
      Save a plot p to a file named fn. If format is given and is one of png, jpeg, webp, svg, pdf, eps, json, or html; it will be the format of the file. By default the format is guessed from the extension of fn.
      scale sets the image scale. width and height set the dimensions, in pixels. Defaults are taken from p.layout, or supplied by plotly
    

    (请注意,这里我介绍了为 savefig 为简洁起见)。

    这表明你的第二次尝试 savefig(p, "myimage.png") 是针对您的目的正确使用该功能。作为从文件扩展名中猜出所需格式的替代方法,您可以通过 format = "png" 创建png输出。