From b99cbec766caa61f2450936d34a9a5e7b323ecbd Mon Sep 17 00:00:00 2001 From: Bel LaPointe Date: Wed, 25 Oct 2023 12:40:06 -0600 Subject: [PATCH] stacked bar chart done --- cmd/clitest/main.go | 97 ++++++++++++++++++++++++++++++++++++++++++--- go.mod | 6 +-- go.sum | 17 +++----- todo.yaml | 3 +- 4 files changed, 99 insertions(+), 24 deletions(-) diff --git a/cmd/clitest/main.go b/cmd/clitest/main.go index 019ab70..edb8d8a 100644 --- a/cmd/clitest/main.go +++ b/cmd/clitest/main.go @@ -4,6 +4,7 @@ import ( "encoding/json" "flag" "fmt" + "io" "log" "net/http" "os" @@ -11,7 +12,8 @@ import ( "sort" "strings" - "github.com/go-echarts/go-echarts/charts" + "github.com/go-echarts/go-echarts/v2/charts" + "github.com/go-echarts/go-echarts/v2/opts" "gogs.inhome.blapointe.com/ana-ledger/ledger" ) @@ -82,8 +84,11 @@ func main() { } slices.Sort(dates) - line := charts.NewLine() - line.AddXAxis(dates) + chart := NewChart("line") + if v := r.URL.Query().Get("chart"); v != "" { + chart = NewChart(v) + } + chart.AddX(dates) switch r.URL.Path { default: @@ -104,7 +109,7 @@ func main() { } key := fmt.Sprintf("%s (%s)", name, currency) if slices.Min(series) != 0 || slices.Max(series) != 0 { - line.AddYAxis(key, series) + chart.AddY(key, series) } } } @@ -125,12 +130,12 @@ func main() { } key := fmt.Sprintf("%s (%s)", name, currency) if slices.Min(series) != 0 || slices.Max(series) != 0 { - line.AddYAxis(key, series) + chart.AddY(key, series) } } } } - if err := line.Render(w); err != nil { + if err := chart.Render(w); err != nil { panic(err) } } @@ -198,3 +203,83 @@ func main() { } } } + +type Chart interface { + AddX(interface{}) + AddY(string, []int) + Render(io.Writer) error +} + +func NewChart(name string) Chart { + switch name { + case "line": + return NewLine() + case "bar": + return NewBar() + case "stack": + return NewStack() + default: + panic("bad chart name " + name) + } +} + +type Line struct { + *charts.Line +} + +func NewLine() Line { + return Line{Line: charts.NewLine()} +} + +func (line Line) AddX(v interface{}) { + line.SetXAxis(v) +} + +func (line Line) AddY(name string, v []int) { + y := make([]opts.LineData, len(v)) + for i := range y { + y[i].Value = v[i] + } + line.AddSeries(name, y) +} + +type Bar struct { + *charts.Bar +} + +func NewBar() Bar { + return Bar{Bar: charts.NewBar()} +} + +func (bar Bar) AddX(v interface{}) { + bar.SetXAxis(v) +} + +func (bar Bar) AddY(name string, v []int) { + y := make([]opts.BarData, len(v)) + for i := range v { + y[i].Value = v[i] + } + bar.AddSeries(name, y) +} + +type Stack struct { + Bar +} + +func NewStack() Stack { + bar := NewBar() + bar.SetSeriesOptions(charts.WithBarChartOpts(opts.BarChart{Stack: "x"})) + return Stack{Bar: bar} +} + +func (stack Stack) AddY(name string, v []int) { + y := make([]opts.BarData, len(v)) + for i := range v { + y[i].Value = v[i] + } + stack.AddSeries(name, y). + SetSeriesOptions(charts.WithBarChartOpts(opts.BarChart{ + Stack: "stackA", + })) +} diff --git a/go.mod b/go.mod index 0144bdd..d044dd3 100644 --- a/go.mod +++ b/go.mod @@ -2,8 +2,4 @@ module gogs.inhome.blapointe.com/ana-ledger go 1.21.1 -require ( - github.com/go-echarts/go-echarts v1.0.0 // indirect - github.com/go-echarts/go-echarts/v2 v2.3.1 // indirect - gogs.inhome.blapointe.com/local/gziphttp v0.0.0-20230508014052-4ccd700640fc // indirect -) +require github.com/go-echarts/go-echarts/v2 v2.3.1 diff --git a/go.sum b/go.sum index a24e2b7..3043e53 100644 --- a/go.sum +++ b/go.sum @@ -1,17 +1,10 @@ -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/go-echarts/go-echarts v1.0.0 h1:n181E4iXwj4zrU9VYmdM2m8dyhERt2w9k9YhHqdp6A8= -github.com/go-echarts/go-echarts v1.0.0/go.mod h1:qbmyAb/Rl1f2w7wKba1D4LoNq4U164yO4/wedFbcWyo= github.com/go-echarts/go-echarts/v2 v2.3.1 h1:Yw0HVjVTxpYm48l974dMjRzx8ni2ql0kKi/kawSgxFE= github.com/go-echarts/go-echarts/v2 v2.3.1/go.mod h1:56YlvzhW/a+du15f3S2qUGNDfKnFOeJSThBIrVFHDtI= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.6.0 h1:jlIyCplCJFULU/01vCkhKuTyc3OorI3bJFuw6obfgho= github.com/stretchr/testify v1.6.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -gogs.inhome.blapointe.com/local/gziphttp v0.0.0-20230508014052-4ccd700640fc h1:ayxolpOV9uIm8rGdmtz03d5JlnbSmFF8daKjmwrZZ1o= -gogs.inhome.blapointe.com/local/gziphttp v0.0.0-20230508014052-4ccd700640fc/go.mod h1:Sdj/NB9h3xrzPDqViQAHoDhA5gmpHkrWRXUauvLSA74= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0 h1:hjy8E9ON/egN1tAYqKb61G10WtihqetD4sz2H+8nIeA= +gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/todo.yaml b/todo.yaml index f502d2a..2aa2974 100755 --- a/todo.yaml +++ b/todo.yaml @@ -1,7 +1,6 @@ todo: - html has a predictive line that has first .66 weight 1, next .16 weight 2, rest weight 4; inverse of span and cares more about recent; when ?predict -- html has stacked bar chart version - html version has fields and submit button rather than query params by hand - html version can accept new transactions for moolah - html version has projections based on compounding/non compounding interest and rate @@ -20,3 +19,5 @@ done: ts: Wed Oct 25 10:06:02 MDT 2023 - todo: = VAL support ts: Wed Oct 25 11:30:37 MDT 2023 +- todo: html has stacked bar chart version + ts: Wed Oct 25 12:40:02 MDT 2023