Support timeline
This commit is contained in:
parent
406d35c6a6
commit
a1f58d4315
9 changed files with 246 additions and 22 deletions
157
main/main.go
Normal file
157
main/main.go
Normal file
|
|
@ -0,0 +1,157 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"crypto/rand"
|
||||
"fmt"
|
||||
"math"
|
||||
"math/big"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"time"
|
||||
|
||||
"github.com/wcharczuk/go-chart/v2"
|
||||
|
||||
charts "github.com/vicanso/go-charts/v2"
|
||||
)
|
||||
|
||||
func writeFile(buf []byte) error {
|
||||
tmpPath := "./main"
|
||||
err := os.MkdirAll(tmpPath, 0700)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
file := filepath.Join(tmpPath, "time-line-chart.png")
|
||||
err = os.WriteFile(file, buf, 0600)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func main() {
|
||||
xAxisValue := []string{}
|
||||
values := []float64{}
|
||||
now := time.Now()
|
||||
firstAxis := 0
|
||||
for i := 0; i < 300; i++ {
|
||||
if firstAxis == 0 && now.Minute() == 0 {
|
||||
firstAxis = i
|
||||
}
|
||||
xAxisValue = append(xAxisValue, now.Format("15:04"))
|
||||
now = now.Add(time.Minute)
|
||||
value, _ := rand.Int(rand.Reader, big.NewInt(100))
|
||||
if (i%50)/10 < 3 {
|
||||
values = append(values, math.NaN())
|
||||
} else {
|
||||
values = append(values, float64(value.Int64()))
|
||||
}
|
||||
}
|
||||
p, err := charts.LineRender(
|
||||
[][]float64{
|
||||
values,
|
||||
},
|
||||
charts.TitleTextOptionFunc("Line"),
|
||||
charts.XAxisDataOptionFunc(xAxisValue, charts.FalseFlag()),
|
||||
charts.LegendLabelsOptionFunc([]string{
|
||||
"Demo",
|
||||
}, "50"),
|
||||
func(opt *charts.ChartOption) {
|
||||
opt.SeriesList[0].MarkLine = charts.SeriesMarkLine{
|
||||
Data: []charts.SeriesMarkData{
|
||||
{
|
||||
Type: charts.SeriesMarkDataTypeCustom,
|
||||
CustomYVal: -1,
|
||||
FillColor: &charts.Color{
|
||||
R: 240,
|
||||
G: 0,
|
||||
B: 0,
|
||||
A: 255,
|
||||
},
|
||||
StrokeColor: &charts.Color{
|
||||
R: 240,
|
||||
G: 0,
|
||||
B: 0,
|
||||
A: 150,
|
||||
},
|
||||
HideValue: true,
|
||||
IgnoreStrokeDashed: true,
|
||||
IgnoreArrow: true,
|
||||
StrokeWidth: 4,
|
||||
XAxisIndex: 200,
|
||||
XAxisEndIndex: 250,
|
||||
},
|
||||
{
|
||||
Type: charts.SeriesMarkDataTypeCustom,
|
||||
CustomYVal: 80,
|
||||
FillColor: &charts.Color{
|
||||
R: 240,
|
||||
G: 0,
|
||||
B: 0,
|
||||
A: 255,
|
||||
},
|
||||
StrokeColor: &charts.Color{
|
||||
R: 240,
|
||||
G: 0,
|
||||
B: 0,
|
||||
A: 255,
|
||||
},
|
||||
AboveColor: &charts.Color{
|
||||
R: 240,
|
||||
G: 0,
|
||||
B: 0,
|
||||
A: 20,
|
||||
},
|
||||
},
|
||||
{
|
||||
Type: charts.SeriesMarkDataTypeCustom,
|
||||
CustomYVal: 50,
|
||||
FillColor: &charts.Color{
|
||||
R: 255,
|
||||
G: 165,
|
||||
B: 0,
|
||||
A: 255,
|
||||
},
|
||||
StrokeColor: &charts.Color{
|
||||
R: 255,
|
||||
G: 165,
|
||||
B: 0,
|
||||
A: 255,
|
||||
},
|
||||
BelowColor: &charts.Color{
|
||||
R: 255,
|
||||
G: 165,
|
||||
B: 0,
|
||||
A: 20,
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
opt.XAxis.FirstAxis = firstAxis
|
||||
opt.XAxis.SplitNumber = 60
|
||||
opt.Legend.Padding = charts.Box{
|
||||
Top: 5,
|
||||
Bottom: 10,
|
||||
}
|
||||
opt.SymbolShow = charts.FalseFlag()
|
||||
opt.LineStrokeWidth = 1
|
||||
opt.ValueFormatter = func(f float64) string {
|
||||
return fmt.Sprintf("%.0f", f)
|
||||
}
|
||||
},
|
||||
charts.PaddingOptionFunc(chart.NewBox(10, 10, 30, 10)),
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
buf, err := p.Bytes()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
err = writeFile(buf)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue