Несколько гистограмм в Юлии с использованием 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
для создания гистограммы.