プログラミング、アカデミック、何か面白いこと。 記載されているものは基本的に私が所属する団体とは関係がありません。

  1. プログラミング
  2. 8 view

[Plotinum][Go]Go言語でグラフを書いてみる

概要

Plotinumというライブラリを使うことでGo言語でグラフを描画することが出来るらしい。
このライブラリを使ってグラフを描いて保存するプログラムを書いてみる。

インストール

以下のコマンドを叩くだけ。非常に簡単。

go get code.google.com/p/plotinum/...

サンプルプログラム

ここに公式のサンプルがいくつか用意されている。
勉強がてら、本記事ではこれにならって、以下の関数のグラフを生成してみる。
ここでwはN(1, 0.05) (平均1で分散0.05)の正規乱数である。
plotinum-target-func

package main

import (
  "code.google.com/p/plotinum/plot"
  "code.google.com/p/plotinum/plotter"
  "image/color"
  "math/rand"
  "math"
)

// Generate Gaussian white noise by Box-Mullar Transform
func normalRand(mu, sigma float64) float64 {
  z := math.Sqrt(-2.0 * math.Log(rand.Float64())) * math.Sin(2.0 * math.Pi * rand.Float64())
  return sigma*z + mu
}

// Make sequence of numbers with common difference
func linspace(start, end float64, n int, x plotter.XYs) {
  for i := 0; i < n; i++ {
    t := float64(i) / float64(n-1)
    x[i].X = (1.0 - t) * start + t * end
  }
}

func main() {
  //===================================================
  // Make observed points

  rand.Seed(int64(0))

  // Prepare X axis of observed points
  n := 50
  answer := make(plotter.XYs, n)
  linspace(-3, 3, n, answer)

  // make observed points
  pix := make([]float64, n)
  for i := 0; i < n; i++ {
    pix[i] = math.Pi * answer[i].X
  }
  for i := 0; i < n; i++ {
    answer[i].Y = math.Sin(pix[i]) / pix[i] + 0.1 * answer[i].X + normalRand(1.0, 0.05)
  }

//====================================================
  // Graph Setting

  // Create a new plot, set its title and axis labels
  p, err := plot.New()
  if err != nil {
    panic(err)
  }
  p.Title.Text = "Plotinum Sample"
  p.X.Label.Text = "X"
  p.Y.Label.Text = "Y"
  p.Add(plotter.NewGrid())

  // Make a scatter plotter and set its style
  // Make a line plotter with points and set its style.
  lpLine, lpPoints, err := plotter.NewLinePoints(answer)
  if err != nil {
    panic(err)
  }
  lpLine.Color = color.RGBA{G: 255, A: 255}
  lpPoints.Shape = plot.PyramidGlyph{}
  lpPoints.Color = color.RGBA{R: 255, A: 255}

  // Add data and legend
  p.Add(lpPoints)
  p.Legend.Add("observed points", lpPoints)

  // Save the plot to a PNG file.
  if err := p.Save(4, 4, "sample.png"); err != nil {
    panic(err)
  }
}

結果

plotinum-result

プログラミングの最近記事

  1. sbt1.0.0のインストールとサンプル実行

  2. [機械学習]各種Pythonライブラリ入りの実験用Dockerイメージを作った

  3. [Node.js]バッチスクリプトの書き方

  4. [Play][Scala]PlayFrameworkでリクエスト駆動のバッチを作る

  5. [OpenCV][Ruby]Webページのデザイン崩れ確認の自動化

関連記事

PAGE TOP