Plots.jl+StatsPlots.jlでDataFrameを可視化する

versioninfo()

# Julia Version 1.2.0
#  Commit c6da87ff4b (2019-08-20 00:03 UTC)
# Platform Info:
# OS: macOS (x86_64-apple-darwin18.6.0)
# CPU: Intel(R) Core(TM) i7-6700K CPU @ 4.00GHz
# WORD_SIZE: 64
# LIBM: libopenlibm
# LLVM: libLLVM-6.0.1 (ORCJIT, skylake)

using RDatasets  # v0.6.6
using Plots  # v0.28.4
using StatsPlots  # v0.13.0
gr();  # 今回バックエンドはGR

Rのggplot2やPythonのSeabornではデータフレームの中身を可視化する際、データフレームを数値ベクトルに変換せず列名を指定してあげるだけで簡単にグラフを作る関数があります。もちろんそれらをJuliaから呼び出すこともできますが、せっかくなので今回はPlots.jlStatsPlots.jlでRやPythonと同様にデータフレームを簡単に可視化してみたいと思います。

@dfマクロ

Plots.jlplot()関数はDataFrameを引数にとることができないのですが、StatsPlot.jl@dfマクロを組み合わせてあげることでデータフレームの列名でデータをplot()関数に渡すことができます。例として今回はirisのDataFrameを使います。Rユーザーにはおなじみですね。

Speciesごとにグループ化された散布図を見たければ以下のように書きます。この場合:SepalLengthがX軸、:SepalWidthがY軸になります。

iris = dataset("datasets", "iris")
@df iris scatter(:SepalLength, :SepalWidth, group=:Species)

output 4 0

ちなみに@dfマクロを使わない場合は

scatter(iris[!,:SepalLength], iris[!,:SepalWidth], group=iris[!,:Species])

でも同じグラフが出力できます。

ちょっと凝ったグラフも@dfマクロとStatsPlots.jlの関数の組み合わせでで以下のように簡単に作れます。

stack(iris) |>
    df -> @df df groupedboxplot(:variable, :value, group=:Species, xtickfontsize=11, bar_width=0.5)

output 6 0

ところで上のgroupedboxplotってドキュメントのどこにも載ってないですよね…。(たまたまソースを読んでて見つけたので使ってみました)

参考