裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

Julia に翻訳--011 2 群のヒストグラム

2021年02月28日 | ブログラミング

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

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PVアクセスランキング にほんブログ村

PVアクセスランキング にほんブログ村