Golearnとplotで散布図を書く

Go入門中です。
Goleanで読み込んだデータをgonum/plotでプロットします。

package main

import (
	"fmt"
	"image/color"
	"math/rand"

	"github.com/sjwhitworth/golearn/base"

	"github.com/gonum/plot"
	"github.com/gonum/plot/plotter"
	"github.com/gonum/plot/vg"
)

func main() {
	rawData, err := base.ParseCSVToInstances("datasets/iris.csv", false)
	if err != nil {
		panic(err)
	}

	_, rows := rawData.Size()

	spal_length_attrs := rawData.AllAttributes()[0].(*base.FloatAttribute)
	spal_length_spec, _ := rawData.GetAttribute(spal_length_attrs)

	spal_width_attrs := rawData.AllAttributes()[1].(*base.FloatAttribute)
	spal_width_spec, _ := rawData.GetAttribute(spal_width_attrs)

	species_attrs := rawData.AllAttributes()[4].(*base.CategoricalAttribute)
	category_values := species_attrs.GetValues()
	category_num := len(category_values)

	fmt.Println(category_values)
	fmt.Println(category_num)

	class_attrs := rawData.AllClassAttributes()[0].(*base.CategoricalAttribute)
	class_spec, _ := rawData.GetAttribute(class_attrs)

	category_vs_raw_map := make(map[string]plotter.XYs)
	fmt.Println(category_vs_raw_map)

	// plot
	for i := 0; i < rows; i++ {
		// category
		category_bytes := rawData.Get(class_spec, i)
		category_name := class_attrs.GetStringFromSysVal(category_bytes)
		fmt.Println(category_name)
		_, isExist := category_vs_raw_map[category_name]
		if !isExist {
			fmt.Println("Add ")
			fmt.Println(category_name)
			category_vs_raw_map[category_name] = make(plotter.XYs, 0)
		}

		spal_length_bytes := rawData.Get(spal_length_spec, i)
		spal_length := spal_length_attrs.GetFloatFromSysVal(spal_length_bytes)

		spal_width_bytes := rawData.Get(spal_width_spec, i)
		spal_width := spal_width_attrs.GetFloatFromSysVal(spal_width_bytes)

		append_xy := plotter.XYs{{spal_length, spal_width}}
		pts := category_vs_raw_map[category_name]
		category_vs_raw_map[category_name] = append(pts, append_xy[0])

	}

	p, err := plot.New()
	if err != nil {
		panic(err)
	}

	p.Title.Text = "Iris Spal Length vs Width"
	p.X.Label.Text = "Length"
	p.Y.Label.Text = "Width"
	p.Add(plotter.NewGrid())

	for name, xys := range category_vs_raw_map {
		fmt.Println(name)
		fmt.Println(xys)
		plot_data, _ := plotter.NewScatter(xys)
		r := uint8(rand.Float32() * 255)
		g := uint8(rand.Float32() * 255)
		b := uint8(rand.Float32() * 255)
		plot_data.GlyphStyle.Color = color.RGBA{R: r, G: g, B: b, A: 255}
		p.Add(plot_data)
		p.Legend.Add(name, plot_data)
	}

	// save pict
	p.Save(4*vg.Inch, 4*vg.Inch, "iris_spal.png")
}


これで次のグラフがプロットされます。
f:id:YuK_Ota:20160427232438p:plain


Go、チュートリアル中なので微妙なところがあれば教えて欲しいです。