accept -graph-type

main
Bel LaPointe 2024-02-21 12:56:54 -07:00
parent 3aa9f635be
commit 83579698c0
2 changed files with 36 additions and 7 deletions

View File

@ -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))

20
main.go
View File

@ -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,13 +88,26 @@ func run(ctx context.Context) error {
Min: minY,
Max: maxY,
}),
)
scatter.AddSeries(y, data)
}
buff := bytes.NewBuffer(nil)
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 {
case "file":