#==========
Julia の修行をするときに,いろいろなプログラムを書き換えるのは有効な方法だ。
以下のプログラムを Julia に翻訳してみる。
2 群のヒストグラム
http://aoki2.si.gunma-u.ac.jp/R/hist2.html
ファイル名: hist2.jl 関数名: hist2
翻訳するときに書いたメモ
R では当時はヒストグラムの重ね描きはできなかった(いまでも base の R ではできない。ggplot は知らないが)。
Julia では PyPlot の plt.hist(),Plots の histogram() でできる。
でも少し機能が足りないところもあるので,自前の関数を書いてそこを補う位の意義はあるであろう。
using PyPlot
plt.hist((x1, x2), bins = -6:0.5:12, density = true, rwidth = 1)
plt.hist((x1, x2), bins = -6:0.5:12, density = false, rwidth = 1)
using Plots
histogram([x1, x2], bins = -6:0.5:12, normalize = true, bar_width = 0.5,
alpha = 0.5, ylabel = "Density", label = "")
histogram([x1, x2], bins = -6:0.5:12, normalize = false, bar_width = 0.5,
alpha = 0.5, ylabel = "Frequency", label = "")
histogram([x1, x2], bins = -6:0.5:12, normalize = :density, bar_width = 0.5,
alpha = 0.5, ylabel = "Density", label = "")
==========#
using Plots
function hist2(x1, x2; n = 30, minx = -Inf, width = Inf, density = false,
color1 = "darkkhaki", color2 = "silver", alpha = 0.7)
function getfreq(x, minx, width, nclass)
tbl = zeros(nclass)
for i in floor.(Int, (x .- minx) ./ width .+ 1)
tbl[i] += 1
end
return tbl
end
pyplot()
x = vcat(x1, x2)
maxx = maximum(x)
if minx == -Inf || width == Inf
minx = minimum(x)
width = (maxx - minx) / n
end
nclass = floor(Int, (maxx - minx) / width) + 1
t = getfreq(x1, minx, width, nclass)
u = getfreq(x2, minx, width, nclass)
if density
t ./= width * length(x1)
u ./= width * length(x2)
end
bar(((0:length(t)-1) .+ 0.25) .* width .+ minx, t, bar_width = 0.5width, label = "")
bar!(((0:length(u)-1) .+ 0.75) .* width .+ minx, u, bar_width = 0.5width, label = "")
plot!(ylabel = density ? "Density" : "Frequency")
end
using Random
Random.seed!(123);
x1 = randn(10000);
x2 = randn(20000) .* 2 .+ 3;
hist2(x1, x2, minx = -6, width = 0.5)
hist2(x1, x2, minx = -6, width = 0.5, density = true)