2017-02-13 3 views
1

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

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

+0

Вы хотите иметь наложенные на несколько гистограмм или иметь подзаголовки? –

+0

Прошу прощения за недоразумение. Я хотел бы наложить несколько гистограмм. – DoubleBass

ответ

2

Существует an example, что делает именно это:

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) 

Я искал «гистограммы» в the Plots.jl repo, нашел this related issue и последующий thelinks к примеру.

+0

Большое спасибо. Прошу прощения, но все же очень новичок в этом;) – DoubleBass

1

С 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 

Это полезно, если у вас есть несколько сюжетных линий.

Edit:

После ссылки Фелипе Lema, вы можете реализовать рецепт для гистограмм, которые разделяют края:

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)) 

Edit 2:

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

Смежные вопросы