JuliaPlots / StatsPlots.jl

Statistical plotting recipes for Plots.jl
Other
437 stars 88 forks source link

`groupedbar` fails to add error bars with plotly backend #496

Open drelatgithub opened 2 years ago

drelatgithub commented 2 years ago

I want to add error bars to a grouped bar chart using groupedbar function using the following line.

groupedbar(rand(3,2); yerror=rand(3,2))

When I use the gr() backend, things work okay, as shown in the screenshot.

![image](https://user-images.githubusercontent.com/11714395/164354061-34779d20-4f82-44b0-92f6-912baa48cb64.png)

However, if I use the plotly() backend, an error is displayed and no plot is produced.

``` Error showing value of type Plots.Plot{Plots.PlotlyBackend}: ERROR: BoundsError: attempt to access 1-element Vector{Int64} at index [2:3] Stacktrace: [1] throw_boundserror(A::Vector{Int64}, I::Tuple{UnitRange{Int64}}) @ Base .\abstractarray.jl:691 [2] checkbounds @ .\abstractarray.jl:656 [inlined] [3] getindex(A::Vector{Int64}, I::UnitRange{Int64}) @ Base .\array.jl:867 [4] plotly_series_segments(series::Plots.Series, plotattributes_base::Dict{Symbol, Any}, x::Vector{Float64}, y::Vector{Float64}, z::Nothing, clims::Tuple{Float64, Float64}) @ Plots C:\Users\█████\.julia\packages\Plots\8ouqB\src\backends\plotly.jl:954 [5] plotly_series(plt::Plots.Plot{Plots.PlotlyBackend}, series::Plots.Series) @ Plots C:\Users\█████\.julia\packages\Plots\8ouqB\src\backends\plotly.jl:606 [6] #369 @ .\array.jl:0 [inlined] [7] MappingRF @ .\reduce.jl:95 [inlined] [8] _foldl_impl(op::Base.MappingRF{Plots.var"#369#370"{Plots.Plot{Plots.PlotlyBackend}}, Base.BottomRF{typeof(vcat)}}, init::Base._InitialValue, itr::Vector{Plots.Series}) @ Base .\reduce.jl:62 [9] foldl_impl @ .\reduce.jl:48 [inlined] [10] mapfoldl_impl @ .\reduce.jl:44 [inlined] [11] #mapfoldl#244 @ .\reduce.jl:162 [inlined] [12] mapfoldl @ .\reduce.jl:162 [inlined] [13] #mapreduce#248 @ .\reduce.jl:289 [inlined] [14] mapreduce @ .\reduce.jl:289 [inlined] [15] #reduce#250 @ .\reduce.jl:458 [inlined] [16] reduce @ .\reduce.jl:458 [inlined] [17] plotly_series @ C:\Users\█████\.julia\packages\Plots\8ouqB\src\backends\plotly.jl:1037 [inlined] [18] plotly_series_json(plt::Plots.Plot{Plots.PlotlyBackend}) @ Plots C:\Users\█████\.julia\packages\Plots\8ouqB\src\backends\plotly.jl:1041 [19] js_body @ C:\Users\█████\.julia\packages\Plots\8ouqB\src\backends\plotly.jl:1106 [inlined] [20] plotly_html_body(plt::Plots.Plot{Plots.PlotlyBackend}, style::Nothing) @ Plots C:\Users\█████\.julia\packages\Plots\8ouqB\src\backends\plotly.jl:1094 [21] plotly_html_body @ C:\Users\█████\.julia\packages\Plots\8ouqB\src\backends\plotly.jl:1068 [inlined] [22] html_body @ C:\Users\█████\.julia\packages\Plots\8ouqB\src\backends\plotly.jl:1046 [inlined] [23] #standalone_html#397 @ C:\Users\█████\.julia\packages\Plots\8ouqB\src\backends\web.jl:10 [inlined] [24] write_temp_html(plt::Plots.Plot{Plots.PlotlyBackend}) @ Plots C:\Users\█████\.julia\packages\Plots\8ouqB\src\backends\web.jl:43 [25] standalone_html_window(plt::Plots.Plot{Plots.PlotlyBackend}) @ Plots C:\Users\█████\.julia\packages\Plots\8ouqB\src\backends\web.jl:57 [26] _display @ C:\Users\█████\.julia\packages\Plots\8ouqB\src\backends\plotly.jl:1130 [inlined] [27] display(#unused#::Plots.PlotsDisplay, plt::Plots.Plot{Plots.PlotlyBackend}) @ Plots C:\Users\█████\.julia\packages\Plots\8ouqB\src\output.jl:148 [28] display(x::Any) @ Base.Multimedia .\multimedia.jl:328 [29] #invokelatest#2 @ .\essentials.jl:716 [inlined] [30] invokelatest @ .\essentials.jl:714 [inlined] [31] print_response(errio::IO, response::Any, show_value::Bool, have_color::Bool, specialdisplay::Union{Nothing, AbstractDisplay}) @ REPL C:\Users\█████\AppData\Local\Programs\Julia-1.7.2\share\julia\stdlib\v1.7\REPL\src\REPL.jl:293 [32] (::REPL.var"#45#46"{REPL.LineEditREPL, Pair{Any, Bool}, Bool, Bool})(io::Any) @ REPL C:\Users\█████\AppData\Local\Programs\Julia-1.7.2\share\julia\stdlib\v1.7\REPL\src\REPL.jl:277 [33] with_repl_linfo(f::Any, repl::REPL.LineEditREPL) @ REPL C:\Users\█████\AppData\Local\Programs\Julia-1.7.2\share\julia\stdlib\v1.7\REPL\src\REPL.jl:510 [34] print_response(repl::REPL.AbstractREPL, response::Any, show_value::Bool, have_color::Bool) @ REPL C:\Users\█████\AppData\Local\Programs\Julia-1.7.2\share\julia\stdlib\v1.7\REPL\src\REPL.jl:275 [35] (::REPL.var"#do_respond#66"{Bool, Bool, REPL.var"#77#87"{REPL.LineEditREPL, REPL.REPLHistoryProvider}, REPL.LineEditREPL, REPL.LineEdit.Prompt})(s::REPL.LineEdit.MIState, buf::Any, ok::Bool) @ REPL C:\Users\█████\AppData\Local\Programs\Julia-1.7.2\share\julia\stdlib\v1.7\REPL\src\REPL.jl:846 [36] #invokelatest#2 @ .\essentials.jl:716 [inlined] [37] invokelatest @ .\essentials.jl:714 [inlined] [38] run_interface(terminal::REPL.Terminals.TextTerminal, m::REPL.LineEdit.ModalInterface, s::REPL.LineEdit.MIState) @ REPL.LineEdit C:\Users\█████\AppData\Local\Programs\Julia-1.7.2\share\julia\stdlib\v1.7\REPL\src\LineEdit.jl:2493 [39] run_frontend(repl::REPL.LineEditREPL, backend::REPL.REPLBackendRef) @ REPL C:\Users\█████\AppData\Local\Programs\Julia-1.7.2\share\julia\stdlib\v1.7\REPL\src\REPL.jl:1232 [40] (::REPL.var"#49#54"{REPL.LineEditREPL, REPL.REPLBackendRef})() @ REPL .\task.jl:423 ```

Is it a bug, or is there anything I should do to make it work? Thank you!

Julia version 1.7.2 StatsPlots version 0.14.33

drelatgithub commented 2 years ago

I just found a similar issue #439, where groupedbar fails with plotly backend. However, the errors reported are different, and I cannot reproduce the error in #439, so I don't think this is a duplicate.

sethaxen commented 2 years ago

I can confirm I'm seeing this error as well. @BeastyBlacksmith do you have any idea why this error might be backend-specific?

BeastyBlacksmith commented 2 years ago

It seems this comes from groupedbar setting a fillrange for the yerror:

julia> groupedbar(rand(3,1); yerror=rand(3,1))[1][3][:fillrange]
1-element Vector{Int64}:
 0

which doesn't make too much sense and is not handled in the plotly backend.

Compare with bar:

julia> bar(rand(3,1); yerror=rand(3,1))[1][3][:fillrange] # returns nothing