stacked bar chart done
parent
b29bb32ba0
commit
b99cbec766
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io"
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
|
|
@ -11,7 +12,8 @@ import (
|
||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"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"
|
"gogs.inhome.blapointe.com/ana-ledger/ledger"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -82,8 +84,11 @@ func main() {
|
||||||
}
|
}
|
||||||
slices.Sort(dates)
|
slices.Sort(dates)
|
||||||
|
|
||||||
line := charts.NewLine()
|
chart := NewChart("line")
|
||||||
line.AddXAxis(dates)
|
if v := r.URL.Query().Get("chart"); v != "" {
|
||||||
|
chart = NewChart(v)
|
||||||
|
}
|
||||||
|
chart.AddX(dates)
|
||||||
|
|
||||||
switch r.URL.Path {
|
switch r.URL.Path {
|
||||||
default:
|
default:
|
||||||
|
|
@ -104,7 +109,7 @@ func main() {
|
||||||
}
|
}
|
||||||
key := fmt.Sprintf("%s (%s)", name, currency)
|
key := fmt.Sprintf("%s (%s)", name, currency)
|
||||||
if slices.Min(series) != 0 || slices.Max(series) != 0 {
|
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)
|
key := fmt.Sprintf("%s (%s)", name, currency)
|
||||||
if slices.Min(series) != 0 || slices.Max(series) != 0 {
|
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)
|
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",
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
|
|
||||||
6
go.mod
6
go.mod
|
|
@ -2,8 +2,4 @@ module gogs.inhome.blapointe.com/ana-ledger
|
||||||
|
|
||||||
go 1.21.1
|
go 1.21.1
|
||||||
|
|
||||||
require (
|
require github.com/go-echarts/go-echarts/v2 v2.3.1
|
||||||
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
|
|
||||||
)
|
|
||||||
|
|
|
||||||
17
go.sum
17
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/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 h1:Yw0HVjVTxpYm48l974dMjRzx8ni2ql0kKi/kawSgxFE=
|
||||||
github.com/go-echarts/go-echarts/v2 v2.3.1/go.mod h1:56YlvzhW/a+du15f3S2qUGNDfKnFOeJSThBIrVFHDtI=
|
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/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
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/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
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=
|
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=
|
gopkg.in/yaml.v3 v3.0.0 h1:hjy8E9ON/egN1tAYqKb61G10WtihqetD4sz2H+8nIeA=
|
||||||
gogs.inhome.blapointe.com/local/gziphttp v0.0.0-20230508014052-4ccd700640fc/go.mod h1:Sdj/NB9h3xrzPDqViQAHoDhA5gmpHkrWRXUauvLSA74=
|
gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
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=
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
todo:
|
todo:
|
||||||
- html has a predictive line that has first .66 weight 1, next .16 weight 2, rest
|
- 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
|
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 has fields and submit button rather than query params by hand
|
||||||
- html version can accept new transactions for moolah
|
- html version can accept new transactions for moolah
|
||||||
- html version has projections based on compounding/non compounding interest and rate
|
- 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
|
ts: Wed Oct 25 10:06:02 MDT 2023
|
||||||
- todo: = VAL support
|
- todo: = VAL support
|
||||||
ts: Wed Oct 25 11:30:37 MDT 2023
|
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
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue