LoginSignup
7

More than 3 years have passed since last update.

posted at

updated at

Organization

Go言語で折れ線グラフや棒グラフを描く

Goでグラフを描きたい

データを可視化するツールやパッケージは沢山ありますが,
Go言語のみでグラフを描く必要があったので,その際に調べたことを整理しました.

Overview

作業環境

  • Go 1.12
  • Windows 10
  • Goland 2019.1

事前準備

以下のコマンドで,goパッケージをインストールしてください.
こちらがgoでグラフを描画するために利用するパッケージになります.
パッケージの詳細はこちら

go get gonum.org/v1/plot/...

折れ線グラフ

折れ線グラフを描画するまでに必要なコードを説明します.
こちらがインポートするパッケージ一覧です.

import (
    "gonum.org/v1/plot"
    "gonum.org/v1/plot/plotter"
    "gonum.org/v1/plot/plotutil"
    "gonum.org/v1/plot/vg"
)

まずは,plotインスタンスを生成してください.
続いて,グラフの表示項目を設定します.

// インスタンスを生成
p, err := plot.New()
if err != nil {
    panic(err)
}

// 表示項目の設定
p.Title.Text = "only english title"
p.X.Label.Text = "X axis"
p.Y.Label.Text = "Y axis"

棒グラフの表示には plotter.XYs 型を利用します.
XY 型は文字通り X,Y軸の値を表現します.数学でよく使うx,y座標表現と対応しています.

type XYs []XY

type XY struct {
    X, Y float64
}

今回のためにサンプルデータを作成しました.
xyAxis構造体を定義し,そのスライスを作成しています.

type xyAxis struct {
    x float64
    y float64
}

nums := []xyAxis {
    [1, 11],
    [2, 33],
    [3, 22],
    [4, 55],
    [5, 44],
    [6, 77],
    [7, 66],
    [8, 99],
    [9, 88],
}

サンプルデータをplotter.XYs型に当てはめます.

pts := make(plotter.XYs, len(nums))

for i, axis := range nums {
    pts[i].X = axis.x
    pts[i].Y = axis.y
}

これでデータの準備は完了しました.
以下の関数を利用してグラフを生成し,その結果を保存します.

// グラフを描画
err = plotutil.AddLinePoints(p, pts)
if err != nil {
    panic(err)
}

// 描画結果を保存
// "5*vg.Inch" の数値を変更すれば,保存する画像のサイズを調整できます.
if err := p.Save(5*vg.Inch, 5*vg.Inch, "sample1.png"); err != nil{
    panic(err)
}

ファイルを実行したのと同じディレクトリに"sample1.png"が生成されます.

sample1.png
sample1.png

棒グラフ

棒グラフを描画するまでに必要なコードを説明します.
こちらがインポートするパッケージ一覧です.

import (
    "gonum.org/v1/plot"
    "gonum.org/v1/plot/plotter"
    "gonum.org/v1/plot/plotutil"
    "gonum.org/v1/plot/vg"
)

まずは,plotインスタンスを生成してください.
続いて,グラフの表示項目を設定します.

// インスタンスを生成
p, err := plot.New()
if err != nil {
    panic(err)
}

// 表示項目の設定
p.Title.Text = "only english title"
p.Y.Label.Text = "Y axis"

棒グラフの描画にはplotter.Values型を利用します.

type Values []float64

今回用意したサンプルデータはこちらです.

nums := plotter.Values{11,33,22,55,44,77,66,99,88}

棒グラフで描画する棒の「幅」を設定します.
今回は15ピクセルとします.

breadth := vg.Points(15)

棒グラフを生成します.
描画後に詳細を設定し,レイアウトを整理します.

bar, err := plotter.NewBarChart(num, breadth)
if err != nil {
    panic(err)
}

// 棒グラフ自体の枠線
bar.LineStyle.Width = vg.Length(0)

// 色を決める 0は赤になります.
bar.Color = plotutil.Color(0)

生成した棒グラフを描画します.
同時に,グラフの説明を追加します.

p.Add(bar)

// 棒グラフの名前を"bar1"とします.
p.Legend.Add("bar1", bar)

// legendの位置を上側にします(デフォルトは下側)
p.Legend.Top = true

// X軸側の説明項目を追加します.
p.NominalX("one", "two", "three", "four", "five", "six", "seven", "eight", "nine")

最後に,描画した画像を保存します.

if err := p.Save(5*vg.Inch, 5*vg.Inch, "sample2.png"); err != nil {
    panic(err)
}

sample2.png
sample2.png

参照記事

package plot
Example plots

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
7