golangで数値から表や図などのグラフをプロットしたい。
awesome-goにあったライブラリを使ってみます。
- vdobler/chart:2次元のチャート(グラフ)を出力する。★580
- gonum/plot:プロットライブラリ。★1203
vdobler/chart
awesome-goにあったから使ってみたもののドキュメントがなく、日本語のユーザーブログも見つからなかったので少し敷居が高い。
とはいえ多種多様なグラフを作れるので便利そうです。
exampleを参考にDumper定義とxxxChart関数をコピーすればいいと思います。
png, svg, txtを出力するので必要ないところはコメントアウトしましょう。
より単純に散布図(Scatter Chart)を作るコードを書いてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
package main import ( "image" "image/color" "image/draw" "image/png" "os" "github.com/vdobler/chart" "github.com/vdobler/chart/imgg" ) func main() { var ( w, h = 400, 300 dataX = []float64{1, 2, 3, 4, 5, 6} dataY = []float64{8, 2, 7, 3, 6, 4} bgcolor = color.RGBA{0xff, 0xff, 0xff, 0xff} bg = image.NewUniform(bgcolor) ) p := chart.ScatterChart{Title: "Sample Scatter Chart"} p.Key.Hide = true p.XRange.Label = "X - Value" p.YRange.Label = "Y - Value" p.AddDataPair("Sample A", dataX, dataY, chart.PlotStyleLinesPoints, chart.Style{}) //plotstyle : PlotStylePoints, PlotStyleLines, PlotStyleLinesPoints, PlotStyleBox img := image.NewRGBA(image.Rect(0, 0, w, h)) draw.Draw(img, img.Bounds(), bg, image.ZP, draw.Src) igr := imgg.AddTo(img, 0, 0, w, h, bgcolor, nil, nil) p.Plot(igr) f, _ := os.Create("plot.png") defer f.Close() png.Encode(f, img) } |
gnuplot感のあるシンプルなグラフが出来ました。
gonum/plot
数値ライブラリgonumのプロット用ライブラリ。
分かりやすいサンプルが用意されている。
シンプルな散布図を作ってみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
package main import ( "image/color" "gonum.org/v1/plot" "gonum.org/v1/plot/plotter" "gonum.org/v1/plot/vg" ) func main() { scatterData := plotter.XYs{ plotter.XY{X: 1, Y: 8}, plotter.XY{X: 2, Y: 2}, plotter.XY{X: 3, Y: 7}, plotter.XY{X: 4, Y: 3}, plotter.XY{X: 5, Y: 6}, plotter.XY{X: 6, Y: 4}, } p, _ := plot.New() p.Title.Text = "Points Example" p.X.Label.Text = "X" p.Y.Label.Text = "Y" s, _ := plotter.NewScatter(scatterData) s.GlyphStyle.Color = color.RGBA{B: 0xff, A: 0xff} p.Add(s, plotter.NewGrid()) p.Save(4*vg.Inch, 4*vg.Inch, "plot.png") //vg.Centimeterもある } |
サブパッケージも併せてGoDocが読みやすいので理解しやすいです。
その他ライブラリ
3次元プロットもできるライブラリをGitHubで漁ってみます。
ちょっととっつきにくそうだけどそのうち試してみたい。
- cpmech/gosl:サイエンスライブラリ。★1306
- Arafatk/glot:gnuplotを操作するライブラリ。★324