裏 RjpWiki

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

Julia で,散布図と回帰直線の信頼限界帯を描画

2022年03月13日 | Julia

ggplot2 の入門ということで定番の図であるが,

https://data-viz-lab.com/ggplot2

にも以下の図がある。

書くのは簡単だよと

> plot <- ggplot(data = data_iris,
+        mapping = aes(x=Sepal.Length,
+                      y=Petal.Length)) +
+   geom_point(aes(colour=Species)) + 
+   geom_smooth(method = "lm",
+               colour="pink")
> plot

が挙げられているが,なんか知らないが,データフレームを専用に変換しないといけないとかで,事前にいかが必要とのこと。

> # データセットのリストを作成
> l <- data()
> results <- l$results %>%
+   as.data.frame()
> list <- results$Item

> # ループ処理でデータセットをデータフレーム型に変換
> for (i in list) {
+   data <- try(get(i), silent = TRUE) %>%  # Use try function to ignore errors
+     try(as.data.frame(), silent = TRUE)
+   if (is.data.frame(data)==TRUE) {
+     name <- paste0("data_", i)
+     assign(name, data)
+   } else {
+   }
+ }

Julia でなるべく汎用性をもたせるように関数を書いてみた。

using Plots
using DataFrames, GLM

function scatterplot(df; xlabel="", ylabel="", grouplabel="", col=:black, conflevel=0.95)
    gr( tick_direction=:out,
        grid=false,
        markerstrokewidth=0,
        alpha=0.4,
        fontfamily="serif",
        guidefontfamily="times",
        guidefontsize=8,
        label="")
    df2 = DataFrame(x=df[:,1], y=df[:,2])
    model = lm(@formula(y ~ x), df2);
    minx, maxx = extrema(df2.x)
    pred = DataFrame(x=range(minx, maxx, length=500));
    pr = predict(model, pred, interval=:confidence, level=conflevel);
    p = scatter(df2.x,
                df2.y,
                color=col,
                xlabel=xlabel,
                yaxis=ylabel);
    plot!(      pred.x,
                pr.prediction,
                linecolor=:red,
                linewidth=2,
                color=:gray,
                ribbon=(pr.prediction .- pr.lower,
                        pr.upper .- pr.prediction))
    for gl in grouplabel
        annotate!(gl[1],
                gl[2],
                text(gl[3],
                "times",
                8,
                gl[4]))
    end
    p
end

scatterplot() にあたえるのは,2列のデータフレーム(一応,1列目が x 軸,2列目が y 軸に対応するものとしておく)

キーワード引数は

x, y 軸の名前 xlabel="", ylabel="",

各グループのアノテーションのタプル (x 座標,y 座標,グループの名前,文字色)のベクトル grouplabel="",

グループを表示する色 col=:black,

信頼限界帯の信頼率 conflevel=0.95

最低限では2列のデータフレームを渡すだけ。

using RDatasets
iris = dataset("datasets", "iris");

palette = [:red, :green, "blue"];
col = repeat(palette, inner=50);

scatterplot(iris[:, [:SepalLength, :PetalLength]])

先程のサイトと同じように描くときは

scatterplot(iris[:, [:SepalLength, :PetalLength]],
    xlabel="Sepal Length",
    ylabel="Petal Length",
    grouplabel=[(5.5, 2.2, "Setosa", :red),
                (6.5, 3.8, "Versicolor", :green),
                (6.0, 6.4, "Virginica", :blue)],
    col=col)

まあ,ggplot() が scatterplot() に相当するのだから,scatterplot()  の呼び出しが 7 行(実質は 2, 3 行)というのはむしろ短い。汎用性もあるし。

出来上がった図は,好みの差もあるが Julia に軍配があがるだろう。

 

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 世の中の流れが悪いだけです☺ | トップ | Julia で,散布図と回帰直線... »
最新の画像もっと見る

コメントを投稿

Julia」カテゴリの最新記事