accept -graph-type
parent
3aa9f635be
commit
83579698c0
19
config.go
19
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))
|
||||
|
|
|
|||
20
main.go
20
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,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":
|
||||
|
|
|
|||
Loading…
Reference in New Issue