feat: support dots render function
This commit is contained in:
parent
7e4de64a0d
commit
8314a2cb37
3 changed files with 393 additions and 46 deletions
384
examples/painter/main.go
Normal file
384
examples/painter/main.go
Normal file
|
|
@ -0,0 +1,384 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io/ioutil"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
|
||||||
|
charts "github.com/vicanso/go-charts"
|
||||||
|
"github.com/wcharczuk/go-chart/v2/drawing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func writeFile(buf []byte) error {
|
||||||
|
tmpPath := "./tmp"
|
||||||
|
err := os.MkdirAll(tmpPath, 0700)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
file := filepath.Join(tmpPath, "painter.png")
|
||||||
|
err = ioutil.WriteFile(file, buf, 0600)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
p, err := charts.NewPainter(charts.PainterOptions{
|
||||||
|
Width: 400,
|
||||||
|
Height: 1200,
|
||||||
|
Type: charts.ChartOutputPNG,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
// 背景色
|
||||||
|
p.SetBackground(p.Width(), p.Height(), drawing.ColorWhite)
|
||||||
|
|
||||||
|
top := 0
|
||||||
|
|
||||||
|
// 画线
|
||||||
|
p.SetDrawingStyle(charts.Style{
|
||||||
|
StrokeColor: drawing.ColorBlack,
|
||||||
|
FillColor: drawing.ColorBlack,
|
||||||
|
StrokeWidth: 1,
|
||||||
|
})
|
||||||
|
p.LineStroke([]charts.Point{
|
||||||
|
{
|
||||||
|
X: 0,
|
||||||
|
Y: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
X: 100,
|
||||||
|
Y: 10,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
X: 200,
|
||||||
|
Y: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
X: 300,
|
||||||
|
Y: 10,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
// 圆滑曲线
|
||||||
|
// top += 50
|
||||||
|
// p.Child(charts.PainterPaddingOption(charts.Box{
|
||||||
|
// Top: top,
|
||||||
|
// })).SetDrawingStyle(charts.Style{
|
||||||
|
// StrokeColor: drawing.ColorBlack,
|
||||||
|
// FillColor: drawing.ColorBlack,
|
||||||
|
// StrokeWidth: 1,
|
||||||
|
// }).SmoothLineStroke([]charts.Point{
|
||||||
|
// {
|
||||||
|
// X: 0,
|
||||||
|
// Y: 0,
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// X: 100,
|
||||||
|
// Y: 10,
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// X: 200,
|
||||||
|
// Y: 0,
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// X: 300,
|
||||||
|
// Y: 10,
|
||||||
|
// },
|
||||||
|
// })
|
||||||
|
|
||||||
|
// 标线
|
||||||
|
top += 50
|
||||||
|
p.Child(charts.PainterPaddingOption(charts.Box{
|
||||||
|
Top: top,
|
||||||
|
})).SetDrawingStyle(charts.Style{
|
||||||
|
StrokeColor: drawing.ColorBlack,
|
||||||
|
FillColor: drawing.ColorBlack,
|
||||||
|
StrokeWidth: 1,
|
||||||
|
StrokeDashArray: []float64{
|
||||||
|
4,
|
||||||
|
2,
|
||||||
|
},
|
||||||
|
}).MarkLine(0, 0, p.Width())
|
||||||
|
|
||||||
|
top += 60
|
||||||
|
// Polygon
|
||||||
|
p.Child(charts.PainterBoxOption(charts.Box{
|
||||||
|
Top: top,
|
||||||
|
})).SetDrawingStyle(charts.Style{
|
||||||
|
StrokeColor: drawing.ColorBlack,
|
||||||
|
FillColor: drawing.ColorBlack,
|
||||||
|
StrokeWidth: 1,
|
||||||
|
}).Polygon(charts.Point{
|
||||||
|
X: 100,
|
||||||
|
Y: 0,
|
||||||
|
}, 50, 6)
|
||||||
|
|
||||||
|
// FillArea
|
||||||
|
top += 60
|
||||||
|
p.Child(charts.PainterPaddingOption(charts.Box{
|
||||||
|
Top: top,
|
||||||
|
})).SetDrawingStyle(charts.Style{
|
||||||
|
FillColor: drawing.ColorBlack,
|
||||||
|
}).FillArea([]charts.Point{
|
||||||
|
{
|
||||||
|
X: 0,
|
||||||
|
Y: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
X: 100,
|
||||||
|
Y: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
X: 150,
|
||||||
|
Y: 40,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
X: 80,
|
||||||
|
Y: 30,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
X: 0,
|
||||||
|
Y: 0,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
// 坐标轴的点
|
||||||
|
top += 50
|
||||||
|
p.Child(
|
||||||
|
charts.PainterBoxOption(charts.Box{
|
||||||
|
Top: top,
|
||||||
|
Left: 1,
|
||||||
|
Right: p.Width() - 1,
|
||||||
|
Bottom: 20,
|
||||||
|
}),
|
||||||
|
).SetDrawingStyle(charts.Style{
|
||||||
|
StrokeColor: drawing.ColorBlack,
|
||||||
|
FillColor: drawing.ColorBlack,
|
||||||
|
StrokeWidth: 1,
|
||||||
|
}).Ticks(charts.TicksOption{
|
||||||
|
Count: 7,
|
||||||
|
Length: 5,
|
||||||
|
})
|
||||||
|
|
||||||
|
// 坐标轴的点,每2格显示一个
|
||||||
|
top += 20
|
||||||
|
p.Child(
|
||||||
|
charts.PainterBoxOption(charts.Box{
|
||||||
|
Top: top,
|
||||||
|
Left: 1,
|
||||||
|
Right: p.Width() - 1,
|
||||||
|
Bottom: 20,
|
||||||
|
}),
|
||||||
|
).SetDrawingStyle(charts.Style{
|
||||||
|
StrokeColor: drawing.ColorBlack,
|
||||||
|
FillColor: drawing.ColorBlack,
|
||||||
|
StrokeWidth: 1,
|
||||||
|
}).Ticks(charts.TicksOption{
|
||||||
|
Unit: 2,
|
||||||
|
Count: 7,
|
||||||
|
Length: 5,
|
||||||
|
})
|
||||||
|
|
||||||
|
// 坐标轴的点,纵向
|
||||||
|
top += 20
|
||||||
|
p.Child(
|
||||||
|
charts.PainterBoxOption(charts.Box{
|
||||||
|
Top: top,
|
||||||
|
Left: 1,
|
||||||
|
Right: p.Width() - 1,
|
||||||
|
Bottom: top + 100,
|
||||||
|
}),
|
||||||
|
).SetDrawingStyle(charts.Style{
|
||||||
|
StrokeColor: drawing.ColorBlack,
|
||||||
|
FillColor: drawing.ColorBlack,
|
||||||
|
StrokeWidth: 1,
|
||||||
|
}).Ticks(charts.TicksOption{
|
||||||
|
Orient: charts.OrientVertical,
|
||||||
|
Count: 7,
|
||||||
|
Length: 5,
|
||||||
|
})
|
||||||
|
|
||||||
|
// 横向展示文本
|
||||||
|
top += 120
|
||||||
|
p.Child(
|
||||||
|
charts.PainterBoxOption(charts.Box{
|
||||||
|
Top: top,
|
||||||
|
Left: 1,
|
||||||
|
Right: p.Width() - 1,
|
||||||
|
Bottom: 20,
|
||||||
|
}),
|
||||||
|
).OverrideTextStyle(charts.Style{
|
||||||
|
FontColor: drawing.ColorBlack,
|
||||||
|
FontSize: 10,
|
||||||
|
}).MultiText(charts.MultiTextOption{
|
||||||
|
TextList: []string{
|
||||||
|
"Mon",
|
||||||
|
"Tue",
|
||||||
|
"Wed",
|
||||||
|
"Thu",
|
||||||
|
"Fri",
|
||||||
|
"Sat",
|
||||||
|
"Sun",
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
// 横向显示文本,靠左
|
||||||
|
top += 20
|
||||||
|
p.Child(
|
||||||
|
charts.PainterBoxOption(charts.Box{
|
||||||
|
Top: top,
|
||||||
|
Left: 1,
|
||||||
|
Right: p.Width() - 1,
|
||||||
|
Bottom: 20,
|
||||||
|
}),
|
||||||
|
).OverrideTextStyle(charts.Style{
|
||||||
|
FontColor: drawing.ColorBlack,
|
||||||
|
FontSize: 10,
|
||||||
|
}).MultiText(charts.MultiTextOption{
|
||||||
|
Position: charts.PositionLeft,
|
||||||
|
TextList: []string{
|
||||||
|
"Mon",
|
||||||
|
"Tue",
|
||||||
|
"Wed",
|
||||||
|
"Thu",
|
||||||
|
"Fri",
|
||||||
|
"Sat",
|
||||||
|
"Sun",
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
// 纵向显示文本
|
||||||
|
top += 20
|
||||||
|
p.Child(
|
||||||
|
charts.PainterBoxOption(charts.Box{
|
||||||
|
Top: top,
|
||||||
|
Left: 1,
|
||||||
|
Right: 50,
|
||||||
|
Bottom: top + 150,
|
||||||
|
}),
|
||||||
|
).OverrideTextStyle(charts.Style{
|
||||||
|
FontColor: drawing.ColorBlack,
|
||||||
|
FontSize: 10,
|
||||||
|
}).MultiText(charts.MultiTextOption{
|
||||||
|
Orient: charts.OrientVertical,
|
||||||
|
Align: charts.AlignRight,
|
||||||
|
TextList: []string{
|
||||||
|
"Mon",
|
||||||
|
"Tue",
|
||||||
|
"Wed",
|
||||||
|
"Thu",
|
||||||
|
"Fri",
|
||||||
|
"Sat",
|
||||||
|
"Sun",
|
||||||
|
},
|
||||||
|
})
|
||||||
|
// 纵向 文本居中
|
||||||
|
p.Child(
|
||||||
|
charts.PainterBoxOption(charts.Box{
|
||||||
|
Top: top,
|
||||||
|
Left: 50,
|
||||||
|
Right: 100,
|
||||||
|
Bottom: top + 150,
|
||||||
|
}),
|
||||||
|
).OverrideTextStyle(charts.Style{
|
||||||
|
FontColor: drawing.ColorBlack,
|
||||||
|
FontSize: 10,
|
||||||
|
}).MultiText(charts.MultiTextOption{
|
||||||
|
Orient: charts.OrientVertical,
|
||||||
|
Align: charts.AlignCenter,
|
||||||
|
TextList: []string{
|
||||||
|
"Mon",
|
||||||
|
"Tue",
|
||||||
|
"Wed",
|
||||||
|
"Thu",
|
||||||
|
"Fri",
|
||||||
|
"Sat",
|
||||||
|
"Sun",
|
||||||
|
},
|
||||||
|
})
|
||||||
|
// 纵向 文本置顶
|
||||||
|
p.Child(
|
||||||
|
charts.PainterBoxOption(charts.Box{
|
||||||
|
Top: top,
|
||||||
|
Left: 100,
|
||||||
|
Right: 150,
|
||||||
|
Bottom: top + 150,
|
||||||
|
}),
|
||||||
|
).OverrideTextStyle(charts.Style{
|
||||||
|
FontColor: drawing.ColorBlack,
|
||||||
|
FontSize: 10,
|
||||||
|
}).MultiText(charts.MultiTextOption{
|
||||||
|
Orient: charts.OrientVertical,
|
||||||
|
Position: charts.PositionTop,
|
||||||
|
Align: charts.AlignCenter,
|
||||||
|
TextList: []string{
|
||||||
|
"Mon",
|
||||||
|
"Tue",
|
||||||
|
"Wed",
|
||||||
|
"Thu",
|
||||||
|
"Fri",
|
||||||
|
"Sat",
|
||||||
|
"Sun",
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
// grid
|
||||||
|
top += 150
|
||||||
|
p.Child(
|
||||||
|
charts.PainterBoxOption(charts.Box{
|
||||||
|
Top: top,
|
||||||
|
Left: 1,
|
||||||
|
Right: p.Width() - 1,
|
||||||
|
Bottom: top + 100,
|
||||||
|
}),
|
||||||
|
).OverrideTextStyle(charts.Style{
|
||||||
|
FontColor: drawing.ColorBlack,
|
||||||
|
FontSize: 10,
|
||||||
|
}).Grid(charts.GridOption{
|
||||||
|
Column: 8,
|
||||||
|
IgnoreColumnLines: []int{0, 8},
|
||||||
|
Row: 8,
|
||||||
|
IgnoreRowLines: []int{0, 8},
|
||||||
|
})
|
||||||
|
|
||||||
|
// dots
|
||||||
|
top += 100
|
||||||
|
p.Child(
|
||||||
|
charts.PainterBoxOption(charts.Box{
|
||||||
|
Top: top,
|
||||||
|
Left: 1,
|
||||||
|
Right: p.Width() - 1,
|
||||||
|
Bottom: top + 20,
|
||||||
|
}),
|
||||||
|
).OverrideDrawingStyle(charts.Style{
|
||||||
|
FillColor: drawing.ColorWhite,
|
||||||
|
StrokeColor: drawing.ColorBlack,
|
||||||
|
StrokeWidth: 1,
|
||||||
|
}).Dots([]charts.Point{
|
||||||
|
{
|
||||||
|
X: 0,
|
||||||
|
Y: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
X: 50,
|
||||||
|
Y: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
X: 100,
|
||||||
|
Y: 10,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
buf, err := p.Bytes()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
err = writeFile(buf)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
46
line.go
46
line.go
|
|
@ -1,46 +0,0 @@
|
||||||
// MIT License
|
|
||||||
|
|
||||||
// Copyright (c) 2022 Tree Xie
|
|
||||||
|
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
// of this software and associated documentation files (the "Software"), to deal
|
|
||||||
// in the Software without restriction, including without limitation the rights
|
|
||||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
// copies of the Software, and to permit persons to whom the Software is
|
|
||||||
// furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
// The above copyright notice and this permission notice shall be included in all
|
|
||||||
// copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
// SOFTWARE.
|
|
||||||
|
|
||||||
package charts
|
|
||||||
|
|
||||||
type LineStyle struct {
|
|
||||||
ClassName string
|
|
||||||
StrokeDashArray []float64
|
|
||||||
StrokeColor Color
|
|
||||||
StrokeWidth float64
|
|
||||||
FillColor Color
|
|
||||||
DotWidth float64
|
|
||||||
DotColor Color
|
|
||||||
DotFillColor Color
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ls *LineStyle) Style() Style {
|
|
||||||
return Style{
|
|
||||||
ClassName: ls.ClassName,
|
|
||||||
StrokeDashArray: ls.StrokeDashArray,
|
|
||||||
StrokeColor: ls.StrokeColor,
|
|
||||||
StrokeWidth: ls.StrokeWidth,
|
|
||||||
FillColor: ls.FillColor,
|
|
||||||
DotWidth: ls.DotWidth,
|
|
||||||
DotColor: ls.DotColor,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -124,6 +124,7 @@ func PainterThemeOption(theme ColorPalette) PainterOption {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// PainterWidthHeightOption set width or height of draw painter
|
||||||
func PainterWidthHeightOption(width, height int) PainterOption {
|
func PainterWidthHeightOption(width, height int) PainterOption {
|
||||||
return func(p *Painter) {
|
return func(p *Painter) {
|
||||||
if width > 0 {
|
if width > 0 {
|
||||||
|
|
@ -678,3 +679,11 @@ func (p *Painter) Grid(opt GridOption) *Painter {
|
||||||
}
|
}
|
||||||
return p
|
return p
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p *Painter) Dots(points []Point) *Painter {
|
||||||
|
for _, item := range points {
|
||||||
|
p.Circle(5, item.X, item.Y)
|
||||||
|
}
|
||||||
|
p.FillStroke()
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue