ズッキーニのプログラミング実験場

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

   Jun 29

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

by zuqqhi2 at 2014年6月29日
Pocket

概要

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

Related Posts

  • 2014年7月6日 [Go][LeastSquareMethod]最小二乗法 でデータを多項式で当てはめる 前提知識 偏微分 行列の基本変形 最小二乗法 20140706 zuqqhi2-lsm-v1 from Hidetomo Suzuki プログラム 実行結果 今回の場合、結果を見る限りn=10(go […]
  • <!--:ja-->[Go]フィボナッチ数列を出力させてみる<!--:--><!--:en-->[Go]Output Fibonacci Series<!--:-->2013年6月29日 [Go]フィボナッチ数列を出力させてみる Go言語でフィボナッチ数列を出力させてみる。 実行。 Output Fibonaaci Series with Go. Run.
  • 2014年6月22日 [Algorithm]貪欲法 目的 以下の問題を貪欲法で解く. できるだけ少ない枚数で指定された金額を支払う場合,何枚になるか. 貪欲法 その時々で最善と思われる行動を取る方法のこと. 利点は単純で計算速度が速く,最善の定義を問題に対して適切に設定するとそれなりに良い解が得られる. […]
  • 2014年6月15日 [Algorithm]深さ優先探索 で迷路を解く 目的 深さ優先探索 […]
  • <!--:ja-->[Go]ubuntuにインストールする<!--:--><!--:en-->[Go]Install Go language on ubuntu<!--:-->2013年6月28日 [Go]ubuntuにインストールする Go インストール インストール aptで普通にインストールできる。 テストプログラム ワークスペース作成 ワークスペースを作成・設定してプログラム作成を行うのが管理しやすい。 そのためまずは、ワークスペースを作成する。 これは簡単に […]
  • 2014年11月9日 [jslint]jslintをコマンドから使ってコード品質チェック 概要 Javascriptは利用方法によるけど運用が難しい言語だと思ってる。 jslintを使用するとコードの品質(?)をチェックすることが出来る。 開発時にjslintが通るコードを書くようにすると、経験上いくらか運用がマシになる気がする。 web上でも使えるけど、コ […]
Pocket

You can follow any responses to this entry through the RSS 2.0 feed. Both comments and pings are currently closed.