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") }
これで次のグラフがプロットされます。
Go、チュートリアル中なので微妙なところがあれば教えて欲しいです。