func PlotXvsYGroupedByXs(title, directory string, groupeddss map[string][]*rdb.Dataset, yValuesKey, yValuesLabel, xValuesLabel string) { var plottingPointArgs []interface{} var plottingErrorArgs []interface{} names := map[string]bool{} xKeys := []float64{} for xKey, dssGroup := range groupeddss { xKeys = append(xKeys, datautils.ParseFloatOrFail(xKey)) for _, d := range dssGroup { names[d.GetName()] = true } } sort.Float64s(xKeys) xKeyStrings := []string{} for _, floatVal := range xKeys { xKeyStrings = append(xKeyStrings, strconv.FormatFloat(floatVal, 'f', 1, 64)) } for name, _ := range names { datasetPointsAcrossGroups := []plotter.XYer{} for _, groupKey := range xKeyStrings { dssGroup := groupeddss[groupKey] var ds *rdb.Dataset for _, d := range dssGroup { if d.GetName() == name { ds = d break } } if ds == nil { str := fmt.Sprintf("Couldn't find ds (%s) in dss group (%s)", name, groupKey) panic(str) } values := ds.GetDatasetFloatValues(yValuesKey) if len(values) == 0 { continue } xys := make(plotter.XYs, len(values)) datasetPointsAcrossGroups = append(datasetPointsAcrossGroups, xys) for i, val := range values { xys[i].X = datautils.ParseFloatOrFail(groupKey) xys[i].Y = val } } mean95, err := plotutil.NewErrorPoints(plotutil.MeanAndConf95, datasetPointsAcrossGroups...) if err != nil { fmt.Println(mean95) panic(err) } plottingPointArgs = append(plottingPointArgs, name, mean95) plottingErrorArgs = append(plottingErrorArgs, mean95) } p, err := plot.New() if err != nil { panic(err) } p.Title.Text = title p.X.Label.Text = xValuesLabel p.Y.Label.Text = yValuesLabel plotutil.AddLinePoints(p, plottingPointArgs...) plotutil.AddErrorBars(p, plottingErrorArgs...) savePlot(title, directory, p) }