stacked bar chart done

This commit is contained in:
Bel LaPointe
2023-10-25 12:40:06 -06:00
parent b29bb32ba0
commit b99cbec766
4 changed files with 99 additions and 24 deletions

View File

@@ -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",
}))
}