TuringLang / MCMCChains.jl

Types and utility functions for summarizing Markov chain Monte Carlo simulations
https://turinglang.org/MCMCChains.jl/
Other
266 stars 29 forks source link

`corner` plot issue #457

Closed yebai closed 2 weeks ago

yebai commented 3 months ago

The following example errors. It seems the issue is from upper stream packages instead of MCMCChains.

Note that the corner plot works fine when the number of variables is smaller than 3.


julia> val = rand(500, 4, 3);

julia> chn = Chains(val, [:a, :b, :c, :d]);

julia> corner(chn)

ERROR: The sum of widths must be 1!
Stacktrace:
  [1] error(s::String)
    @ Base ./error.jl:35
  [2] Plots.GridLayout(::Int64, ::Vararg{…}; parent::Plots.RootLayout, widths::Vector{…}, heights::Vector{…}, kw::@Kwargs{})
    @ Plots ~/.julia/packages/Plots/ju9dp/src/layouts.jl:232
  [3] grid(::Int64, ::Vararg{Int64}; kw::@Kwargs{widths::Vector{Float64}, heights::Vector{Float64}})
    @ Plots ~/.julia/packages/Plots/ju9dp/src/layouts.jl:209
  [4] macro expansion
    @ ~/.julia/packages/StatsPlots/cStOe/src/cornerplot.jl:29 [inlined]
  [5] apply_recipe(plotattributes::AbstractDict{Symbol, Any}, cp::StatsPlots.CornerPlot)
    @ StatsPlots ~/.julia/packages/RecipesBase/BRe07/src/RecipesBase.jl:300
  [6] _process_userrecipes!(plt::Any, plotattributes::Any, args::Any)
    @ RecipesPipeline ~/.julia/packages/RecipesPipeline/BGM3l/src/user_recipe.jl:38
  [7] recipe_pipeline!(plt::Any, plotattributes::Any, args::Any)
    @ RecipesPipeline ~/.julia/packages/RecipesPipeline/BGM3l/src/RecipesPipeline.jl:72
  [8] _plot!(plt::Plots.Plot, plotattributes::Any, args::Any)
    @ Plots ~/.julia/packages/Plots/ju9dp/src/plot.jl:223
  [9] #plot#188
    @ ~/.julia/packages/Plots/ju9dp/src/plot.jl:102 [inlined]
 [10] plot
    @ ~/.julia/packages/Plots/ju9dp/src/plot.jl:93 [inlined]
 [11] corner(args::Chains{Float64, AxisArrays.AxisArray{…}, Missing, @NamedTuple{…}, @NamedTuple{}})
    @ MCMCChains ~/.julia/packages/RecipesBase/BRe07/src/RecipesBase.jl:427
 [12] top-level scope
    @ REPL[53]:1
Some type information was truncated. Use `show(err)` to see complete types.
penelopeysm commented 3 weeks ago

I looked into this, and it's a classic problem. Plots.jl checks that the widths add up to 1 using:

        if sum(widths) != 1
            error("The sum of widths must be 1!")
        end

With the example in the docs

using MCMCChains
using StatsPlots

# Define the experiment
n_iter = 100
n_name = 3
n_chain = 2

# experiment results
val = randn(n_iter, n_name, n_chain) .+ [1, 2, 3]'
val = hcat(val, rand(1:2, n_iter, 1, n_chain))

# construct a Chains object
chn = Chains(val, [:A, :B, :C, :D])

corner(chn)

it turns out that

widths = [0.3, 0.3, 0.3, 0.1]

and ...

julia> 0.3 + 0.3 + 0.3 + 0.1
0.9999999999999999
penelopeysm commented 3 weeks ago

Upstream PR: https://github.com/JuliaPlots/Plots.jl/pull/4972

penelopeysm commented 3 weeks ago

Merged now, will be fixed with the next release of Plots.jl