以下に 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 には勝った。