accept -graph-type
parent
3aa9f635be
commit
83579698c0
19
config.go
19
config.go
|
|
@ -16,6 +16,9 @@ import (
|
||||||
type Config struct {
|
type Config struct {
|
||||||
Data Data
|
Data Data
|
||||||
Output url.URL
|
Output url.URL
|
||||||
|
Graph struct {
|
||||||
|
Type string
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type Data struct {
|
type Data struct {
|
||||||
|
|
@ -36,7 +39,8 @@ func newConfig() (Config, error) {
|
||||||
dataWeightFloor := envOr("DATA_WEIGHT_FLOOR", `12`)
|
dataWeightFloor := envOr("DATA_WEIGHT_FLOOR", `12`)
|
||||||
dataTitle := envOr("DATA_TITLE", ``)
|
dataTitle := envOr("DATA_TITLE", ``)
|
||||||
dataSubtitle := envOr("DATA_SUBTITLE", ``)
|
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 := flag.NewFlagSet("cmd", flag.ContinueOnError)
|
||||||
fs.StringVar(&dataPoints, "data-points", dataPoints, `JSON [[x, y, z, ...]]`)
|
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(&dataTitle, "data-title", dataTitle, `chart title`)
|
||||||
fs.StringVar(&dataSubtitle, "data-subtitle", dataSubtitle, `chart subtitle`)
|
fs.StringVar(&dataSubtitle, "data-subtitle", dataSubtitle, `chart subtitle`)
|
||||||
fs.StringVar(&output, "output", output, `scheme://location`)
|
fs.StringVar(&output, "output", output, `scheme://location`)
|
||||||
|
fs.StringVar(&graphType, "graph-type", graphType, `[scatter, line]`)
|
||||||
if err := fs.Parse(os.Args[1:]); err != nil {
|
if err := fs.Parse(os.Args[1:]); err != nil {
|
||||||
return Config{}, err
|
return Config{}, err
|
||||||
}
|
}
|
||||||
|
|
@ -89,6 +94,7 @@ func newConfig() (Config, error) {
|
||||||
|
|
||||||
result.Data.Title = dataTitle
|
result.Data.Title = dataTitle
|
||||||
result.Data.Subtitle = dataSubtitle
|
result.Data.Subtitle = dataSubtitle
|
||||||
|
result.Graph.Type = graphType
|
||||||
|
|
||||||
if u, err := url.Parse(output); err != nil {
|
if u, err := url.Parse(output); err != nil {
|
||||||
return result, fmt.Errorf("failed to parse $OUTPUT (%s): %w", output, err)
|
return result, fmt.Errorf("failed to parse $OUTPUT (%s): %w", output, err)
|
||||||
|
|
@ -106,6 +112,17 @@ func envOr(k, v string) string {
|
||||||
return v
|
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) {
|
func (d Data) AsScatterData() (string, string, []opts.ScatterData, error) {
|
||||||
if !(2 <= len(d.Labels) && len(d.Labels) <= 3) {
|
if !(2 <= len(d.Labels) && len(d.Labels) <= 3) {
|
||||||
return "", "", nil, fmt.Errorf("cannot map %d dimensions to [2,3]", len(d.Labels))
|
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)
|
log.Printf("x=[%v, %v] y=[%v, %v]", minX, maxX, minY, maxY)
|
||||||
|
|
||||||
scatter := charts.NewScatter()
|
globalOpts := []charts.GlobalOpts{
|
||||||
scatter.SetGlobalOptions(
|
|
||||||
charts.WithTitleOpts(opts.Title{
|
charts.WithTitleOpts(opts.Title{
|
||||||
Title: config.Data.Title,
|
Title: config.Data.Title,
|
||||||
Subtitle: config.Data.Subtitle,
|
Subtitle: config.Data.Subtitle,
|
||||||
|
|
@ -89,13 +88,26 @@ func run(ctx context.Context) error {
|
||||||
Min: minY,
|
Min: minY,
|
||||||
Max: maxY,
|
Max: maxY,
|
||||||
}),
|
}),
|
||||||
)
|
}
|
||||||
scatter.AddSeries(y, data)
|
|
||||||
|
|
||||||
buff := bytes.NewBuffer(nil)
|
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 {
|
if err := scatter.Render(buff); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
switch config.Output.Scheme {
|
switch config.Output.Scheme {
|
||||||
case "file":
|
case "file":
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue