From 83579698c0a3df60d85c34ad454ca0075b9ff7ab Mon Sep 17 00:00:00 2001 From: Bel LaPointe <153096461+breel-render@users.noreply.github.com> Date: Wed, 21 Feb 2024 12:56:54 -0700 Subject: [PATCH] accept -graph-type --- config.go | 19 ++++++++++++++++++- main.go | 24 ++++++++++++++++++------ 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/config.go b/config.go index 5ca3fa9..508c5d4 100644 --- a/config.go +++ b/config.go @@ -16,6 +16,9 @@ import ( type Config struct { Data Data Output url.URL + Graph struct { + Type string + } } type Data struct { @@ -36,7 +39,8 @@ func newConfig() (Config, error) { dataWeightFloor := envOr("DATA_WEIGHT_FLOOR", `12`) dataTitle := envOr("DATA_TITLE", ``) dataSubtitle := envOr("DATA_SUBTITLE", ``) - output := envOr("OUTPUT", `file:///tmp/f`) + output := envOr("OUTPUT", `file:///tmp/f.html`) + graphType := envOr("GRAPH_TYPE", `scatter`) fs := flag.NewFlagSet("cmd", flag.ContinueOnError) fs.StringVar(&dataPoints, "data-points", dataPoints, `JSON [[x, y, z, ...]]`) @@ -46,6 +50,7 @@ func newConfig() (Config, error) { fs.StringVar(&dataTitle, "data-title", dataTitle, `chart title`) fs.StringVar(&dataSubtitle, "data-subtitle", dataSubtitle, `chart subtitle`) fs.StringVar(&output, "output", output, `scheme://location`) + fs.StringVar(&graphType, "graph-type", graphType, `[scatter, line]`) if err := fs.Parse(os.Args[1:]); err != nil { return Config{}, err } @@ -89,6 +94,7 @@ func newConfig() (Config, error) { result.Data.Title = dataTitle result.Data.Subtitle = dataSubtitle + result.Graph.Type = graphType if u, err := url.Parse(output); err != nil { return result, fmt.Errorf("failed to parse $OUTPUT (%s): %w", output, err) @@ -106,6 +112,17 @@ func envOr(k, v string) string { return v } +func scatterAsLineData(data []opts.ScatterData) []opts.LineData { + result := make([]opts.LineData, len(data)) + for i := range data { + result[i] = opts.LineData{ + Value: data[i].Value, + SymbolSize: data[i].SymbolSize, + } + } + return result +} + func (d Data) AsScatterData() (string, string, []opts.ScatterData, error) { if !(2 <= len(d.Labels) && len(d.Labels) <= 3) { return "", "", nil, fmt.Errorf("cannot map %d dimensions to [2,3]", len(d.Labels)) diff --git a/main.go b/main.go index 2f804cc..b902281 100644 --- a/main.go +++ b/main.go @@ -64,8 +64,7 @@ func run(ctx context.Context) error { } log.Printf("x=[%v, %v] y=[%v, %v]", minX, maxX, minY, maxY) - scatter := charts.NewScatter() - scatter.SetGlobalOptions( + globalOpts := []charts.GlobalOpts{ charts.WithTitleOpts(opts.Title{ Title: config.Data.Title, Subtitle: config.Data.Subtitle, @@ -89,12 +88,25 @@ func run(ctx context.Context) error { Min: minY, Max: maxY, }), - ) - scatter.AddSeries(y, data) + } buff := bytes.NewBuffer(nil) - if err := scatter.Render(buff); err != nil { - return err + + switch config.Graph.Type { + case "line": + line := charts.NewLine() + line.SetGlobalOptions(globalOpts...) + line.AddSeries(y, scatterAsLineData(data)) + if err := line.Render(buff); err != nil { + return err + } + case "scatter": + scatter := charts.NewScatter() + scatter.SetGlobalOptions(globalOpts...) + scatter.AddSeries(y, data) + if err := scatter.Render(buff); err != nil { + return err + } } switch config.Output.Scheme {