裏 RjpWiki

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

Julia で積み上げ棒グラフ,横軸が日付

2021年09月24日 | ブログラミング

以下に R/ggplot2 による積み上げ棒グラフの作成例がある
https://qiita.com/text_owleyes_0214/items/d6c815e04c284a5677a0

Julia だったらどんな風かな?

using CSV, DataFrames

# Julia では,直接は読めない
# dat = CSV.read("https://vrs-data.cio.go.jp/vaccination/opendata/latest/summary_by_date.csv", DataFrame)
# ArgumentError: "https://vrs-data.cio.go.jp/vaccination/opendata/latest/summary_by_date.csv" is not a valid file

#= 何回も直接読みに行くのは避けること

import Pkg; Pkg.add("HTTP") # まだインストールされていないなら
using HTTP
res = HTTP.get("https://vrs-data.cio.go.jp/vaccination/opendata/latest/summary_by_date.csv");
df = CSV.read(res.body, DataFrame);
rename!(df, [2 => :first, 3 => :second]);
CSV.write("vaccination.csv", df) # 読めたら保存しておく。
=#

df = CSV.read("vaccination.csv", DataFrame); # 二回目以降はこのファイルから入力する

using Plots, StatsPlots, Dates

Plots の groupedbar は,long format にする必要はない。
日付は月曜日の位置につける(文字列を斜めになんかしない)。
label が複数あるときは,1×n 列で指定する。
legend は枠外に出さない(出したければ legend=:outertopright)にする。

groupedbar(Matrix(df[[:first, :second]]), bar_position = :stack,
           bar_width=1, alpha=0.6,
           label=["first" "second"], legend=:topleft, # :outertopright,
           title = "Counts of vaccination, summary by date.",
           xlabel="date", ylabel="counts",
           xticks=(1:7:165, Dates.format.(df.date,"mm-dd")[1:7:165]),   
          
xtickfontsize=6, tick_direction=:out, yformatter=:plain,
          
grid=false, size=(800, 500))

ついでに,累積度数分布図も描いておく(というか,こちらの方が情報は多いか?)
まだ 2 回接種は,1 回接種の半分くらいなんだな。

df.cum_first = cumsum(df.first)
df.cum_second = cumsum(df.second);
groupedbar(Matrix(df[[:cum_first, :cum_second]]), bar_position = :stack, bar_width=1, alpha=0.6,
    label=["first" "second"], legend=:topleft, # :outertopright,
    title = "Cumulated counts of vaccination, summary by date.",
    xlabel="date", ylabel="cumulated counts",
    xticks=(1:7:165, Dates.format.(df.date,"mm-dd")[1:7:165]), xtickfontsize=6,
    tick_direction=:out, yformatter=:plain, grid=false, size=(800, 400))

VegaLite では,longformat にしないといけない(面倒じゃ)。

df2 = DataFrames.stack(df, 2:3);

rename!(df2, [:variable => :vaccined, :value => :counts]);

using VegaLite

記述は json ということで,馴染みがない。
legend は orient = "top-right" で。
VegaLite の 1 週間は日曜始まりのようだ。

df2 |>
       @vlplot(
           :bar,
           width = 600,
           height = 400,
           title = "Counts of vaccination, summary by date.",
           x = {:date, axis={format="%m-%d", title="date"}},
           y = :counts,
           color = {
               :vaccined,
               scale = {
                   domain = ["first", "second"],
                   range = ["#e7ba52a0", "#9467bda0"]
               },
               legend = {
                   title = "vaccined",
                   orient = "top-right"
               }
           },
           config = {
               axis = {
                   grid = false
               }
           }
       )

どちらでも,おなじくらい綺麗だ。ggplot2 には勝った。

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

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

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