fix ticks on x axis

This commit is contained in:
gutmet 2020-04-19 10:20:00 +02:00
parent 24dcb9702a
commit 79282317b1

View File

@ -6,6 +6,7 @@ import (
"fmt" "fmt"
"git.gutmet.org/go-chart.git" "git.gutmet.org/go-chart.git"
"git.gutmet.org/go-chart.git/drawing" "git.gutmet.org/go-chart.git/drawing"
util "git.gutmet.org/go-chart.git/util"
"git.gutmet.org/goutil.git" "git.gutmet.org/goutil.git"
"math" "math"
"os" "os"
@ -157,18 +158,18 @@ func show(args showFlags) error {
fromTo := dateInterval{from, to} fromTo := dateInterval{from, to}
s1 := timeSeries("weight", chart.ColorCyan) s1 := timeSeries("weight", chart.ColorCyan)
yRange1 := addPointsGetRange(&s1, points, fromTo, func(p point) float64 { return p.weight }) xRange, yRange1 := addPointsGetRange(&s1, points, fromTo, func(p point) float64 { return p.weight })
s2 := timeSeries("trend", drawing.Color{R: 255, A: 255}) s2 := timeSeries("trend", drawing.Color{R: 255, A: 255})
yRange2 := addPointsGetRange(&s2, points, fromTo, func(p point) float64 { return p.trend }) _, yRange2 := addPointsGetRange(&s2, points, xRange, func(p point) float64 { return p.trend })
s3 := timeSeries("diet", drawing.Color{R: 255, G: 211, A: 255}) s3 := timeSeries("diet", drawing.Color{R: 255, G: 211, A: 255})
yRange3 := yRange2 yRange3 := yRange2
if dietpoints != nil { if dietpoints != nil {
yRange3 = addPointsGetRange(&s3, dietpoints, fromTo, func(p point) float64 { return p.weight }) _, yRange3 = addPointsGetRange(&s3, dietpoints, xRange, func(p point) float64 { return p.weight })
} }
YRange := yRange{math.Min(math.Min(yRange1.min, yRange2.min), yRange3.min), math.Max(math.Max(yRange1.max, yRange2.max), yRange3.max)} YRange := yRange{math.Min(math.Min(yRange1.min, yRange2.min), yRange3.min), math.Max(math.Max(yRange1.max, yRange2.max), yRange3.max)}
YRange.min = math.Floor(YRange.min) - 1.0 YRange.min = math.Floor(YRange.min) - 1.0
YRange.max = math.Ceil(YRange.max) + 1.0 YRange.max = math.Ceil(YRange.max) + 1.0
graph := graph(s1, s2, s3, YRange) graph := graph(xticks(xRange), s1, s2, s3, YRange)
err = writeGraphToFile(graph) err = writeGraphToFile(graph)
if err != nil { if err != nil {
return err return err
@ -249,11 +250,35 @@ func main() {
/*****************************/ /*****************************/
func addPointsGetRange(s *chart.TimeSeries, points []point, di dateInterval, project func(point) float64) yRange { func xticks(d dateInterval) []chart.Tick {
ticks := []chart.Tick{}
start := d.min
end := d.max
stepDays := int(end.Sub(start).Hours() / 24 / 10)
if stepDays < 1 {
stepDays = 1
}
for i := 0; start.AddDate(0, 0, i).Before(end.AddDate(0, 0, stepDays)); i += stepDays {
val := start.AddDate(0, 0, i)
label := val.Format(dateLayout)
ticks = append(ticks, chart.Tick{util.Time.ToFloat64(val), label})
}
return ticks
}
func addPointsGetRange(s *chart.TimeSeries, points []point, di dateInterval, project func(point) float64) (dateInterval, yRange) {
XRange := dateInterval{time.Now().AddDate(10000, 0, 0), time.Now().AddDate(-10000, 0, 0)}
YRange := yRange{math.MaxFloat64, -math.MaxFloat64} YRange := yRange{math.MaxFloat64, -math.MaxFloat64}
for _, p := range points { for _, p := range points {
if (p.date.After(di.min) || p.date.Equal(di.min)) && (p.date.Before(di.max) || p.date.Equal(di.max)) && !math.IsNaN(project(p)) { if (p.date.After(di.min) || p.date.Equal(di.min)) && (p.date.Before(di.max) || p.date.Equal(di.max)) && !math.IsNaN(project(p)) {
s.XValues = append(s.XValues, p.date) xVal := p.date
s.XValues = append(s.XValues, xVal)
if xVal.Before(XRange.min) {
XRange.min = xVal
}
if xVal.After(XRange.max) {
XRange.max = xVal
}
yVal := project(p) yVal := project(p)
s.YValues = append(s.YValues, yVal) s.YValues = append(s.YValues, yVal)
if yVal < YRange.min { if yVal < YRange.min {
@ -264,14 +289,14 @@ func addPointsGetRange(s *chart.TimeSeries, points []point, di dateInterval, pro
} }
} }
} }
return YRange return XRange, YRange
} }
func timeSeries(name string, color drawing.Color) chart.TimeSeries { func timeSeries(name string, color drawing.Color) chart.TimeSeries {
return chart.TimeSeries{Name: name, Style: chart.Style{Show: true, StrokeColor: color}} return chart.TimeSeries{Name: name, Style: chart.Style{Show: true, StrokeColor: color}}
} }
func graph(s1 chart.TimeSeries, s2 chart.TimeSeries, s3 chart.TimeSeries, YRange yRange) chart.Chart { func graph(xticks []chart.Tick, s1 chart.TimeSeries, s2 chart.TimeSeries, s3 chart.TimeSeries, YRange yRange) chart.Chart {
graph := chart.Chart{ graph := chart.Chart{
Width: width, Width: width,
Height: height, Height: height,
@ -280,6 +305,7 @@ func graph(s1 chart.TimeSeries, s2 chart.TimeSeries, s3 chart.TimeSeries, YRange
NameStyle: chart.StyleShow(), NameStyle: chart.StyleShow(),
Style: chart.StyleShow(), Style: chart.StyleShow(),
ValueFormatter: chart.TimeDateValueFormatter, ValueFormatter: chart.TimeDateValueFormatter,
Ticks: xticks,
}, },
YAxis: chart.YAxis{ YAxis: chart.YAxis{
Name: "kg", Name: "kg",