鴨川η

Gadflyの紹介

はじめに

卒論の時期になりました. 私もクリスマス締め切りの卒論を書いています.

さて,卒論の実験結果や統計処理した結果をグラフに出す必要がある方はけっこういるのではないでしょうか.

というわけでGadflyを紹介します. 夏休みに書いた論文の図はGadflyで描きましたし,輪講で使うグラフもGadflyで描きました. ゼミ生の中で好評でした✌️

実行環境はMacを前提としていますので適宜お手元の環境に読み替えてください.

Gadflyって何?

juliaという技術計算向けの高速でイケてる言語の描画パッケージの1つです.

手軽にかっこいい画像が作れます.

保存形式は以下の6つに対応しています.

  • SVG
  • SVGJS
  • PNG
  • PDF
  • PS
  • PGF

nzwはPDFで出力してTeXやパワーポイントに貼り付けてることが多いです.

ちなみにGadfly以外にもいろいろとあるようです.-> julia plotting

導入

juliaの導入はhomebrewなりを使ってやるとして,juliaを起動したら以下のコマンドでGadflyをインストールします.

julia> Pkg.add("Gadfly")

インストールが成功したら,以下のコマンドを実行すればplotができるようになります.

julia> using Gadfly

iris(アヤメという多年草)のデータを例にあげることがあるので

Pkg.add("RDatasets")
using RDatasets

をあらかじめやっておきます.

全て紹介すると大変なので,ここでは自分がよく使うものだけ紹介します.

自分がよくつかうplot

まずは簡単な散布図から.

plot(x=rand(13),y=rand(13))

ex1 はい,綺麗ですね.うっとりします.

rand(13)は13個の乱数がはいったArrayを生成しています. xyでindexが同じものを1つのデータ点としてplotしています.


plotする図によってパラメータが違っていて散布図(point)であればcolorが指定できます.

この例では,アヤメの品種にごとに色わけしています. irisのデータはDataFrame(excelの表みたいなやつ)に格納されているので,x軸,y軸を指定する必要があります.

plot(dataset("datasets", "iris"), x="PetalLength", y="PetalWidth", color="Species", Geom.point)

ex2 イィ…


言語処理をやっているのでword2vec(分散表現)の例を示すことがあります. ざっくり分散表現を説明すると,密なベクトル空間の1点に単語をマッピングすることです.

例えば,以下の4行からなるCSVファイルw2v.csvがjuliaのREPLを起動したディレクトリにあったとして描画します.

x,y,word
1.0,2.0,man
2.0,3.0,woman
2.0,2.0,king
3.0,3.0,queen
df = readtable("w2v.csv")
plot(df, x="x", y="y", label="word", Geom.point, Geom.label, Scale.x_continuous(minvalue=0.0, maxvalue=4.0),Scale.y_continuous(minvalue=0.0, maxvalue=4.0))

dfはCSVファイルを読み込んだDataFrameです.

x="x"の右辺でdfの列名を指定します.label="word"についても同様です.

Scale.x_continuous(minvalue=0.0, maxvalue=4.0)は,描画するx軸の最小値最大値の範囲を指定します.

ex1


関数の描画も可能です. 例えばlogistic関数とtanhについて \(-5 \leq x \leq 5\) を定義域とした場合で描画します.

f(x) = 1/(1+exp(-x))
plot([f,tanh], -5, 5, color=repeat(["logistic", "tanh"]))

ex1


subplot_gridを使うと複数のグラフを並べることができます. この例ではアルゴリズムごとに棒グラフをわけて描画してます.

data = DataFrame()
data[:Algorithm] = ["methodA", "methodA", "methodB", "methodB", "proposal", "proposal"]
data[:Dataset] = ["data1", "data2", "data1", "data2", "data1", "data2"]
data[:Precision] = [0.5, 0.4, 0.6, 0.62, 0.8, 0.9]

plot(data, xgroup="Algorithm", x="Dataset", y="Precision", color="Dataset",
  Scale.y_continuous(minvalue=0),
  Guide.ylabel("正解率"),
  Guide.title("テストデータに対する正解率の比較"),
  Geom.subplot_grid(Geom.bar()))

ex

おわりに

紹介しきれませんでしたが,フォントサイズや表示する目盛などを調整できます.

Docsにまとまっているのでそちらをご参照ください.

以上 klis advent calendar 2015 & 卒研 advent calendar 2015の8日目の記事でした.