Несколько гистограмм в Юлии с использованием Plots.jl

Я работаю с большим количеством наблюдений и, чтобы действительно узнать это, я хочу делать гистограммы, используя Plots.jl. Мой вопрос заключается в том, как я могу сделать несколько гистограмм на одном графике, так как это было бы очень удобно. Я уже пробовал несколько вещей, но я немного запутался с различными источниками прорисовки в julia (plots.jl, pyplot, gadfly,...).

Я не знаю, поможет ли это мне опубликовать часть моего кода, так как это более общий вопрос. Но я рад опубликовать его, если это необходимо.

2 ответа

Решение

Вот пример, который делает именно это:

using Plots
pyplot()

n = 100
x1, x2 = rand(n), 3rand(n)

# see issue #186... this is the standard histogram call
# our goal is to use the same edges for both series
histogram(Any[x1, x2], line=(3,0.2,:green), fillcolor=[:red :black], fillalpha=0.2)

Я искал "гистограммы" в репозитории Plots.jl, нашел эту связанную проблему и следовал по ссылкам на пример.

С PlotsЕсть две возможности показать несколько серий на одном графике:

Во-первых, вы можете использовать матрицу, где каждый столбец составляет отдельный ряд:

a, b, c = randn(100), randn(100), randn(100)
histogram([a b c])

Вот, hcat используется для объединения векторов (обратите внимание на пробелы вместо запятых).

Это эквивалентно

histogram(randn(100,3))

Вы можете применить параметры к отдельным сериям, используя матрицу строк:

histogram([a b c], label = ["a" "b" "c"])

(Опять же запишите пробелы вместо запятых)

Во-вторых, вы можете использовать plot! и его варианты для обновления предыдущего сюжета:

histogram(a)  # creates a new plot
histogram!(b) # updates the previous plot
histogram!(c) # updates the previous plot

Кроме того, вы можете указать, какой график обновлять:

p = histogram(a) # creates a new plot p
histogram(b)     # creates an independent new plot
histogram!(p, c) # updates plot p

Это полезно, если у вас есть несколько участков.

Редактировать:

Следуя ссылкам Фелипе Лемы, вы можете реализовать рецепт для гистограмм с общими краями:

using StatsBase
using PlotRecipes

function calcbins(a, bins::Integer)
    lo, hi = extrema(a)
    StatsBase.histrange(lo, hi, bins) # nice edges
end

calcbins(a, bins::AbstractVector) = bins

@userplot GroupHist 

@recipe function f(h::GroupHist; bins = 30)
    args = h.args
    length(args) == 1 || error("GroupHist should be given one argument")
    bins = calcbins(args[1], bins)
    seriestype := :bar
    bins, mapslices(col -> fit(Histogram, col, bins).weights, args[1], 1)
end

grouphist(randn(100,3))

Изменить 2:

Поскольку это быстрее, я изменил рецепт, чтобы использовать StatsBase.fit для создания гистограммы.

Другие вопросы по тегам