fix ticks on x axis
This commit is contained in:
parent
24dcb9702a
commit
79282317b1
42
hdiet.go
42
hdiet.go
|
@ -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",
|
||||||
|
|
Loading…
Reference in New Issue
Block a user