docs: update documents
This commit is contained in:
parent
5db24de7ed
commit
2067bc0062
13 changed files with 695 additions and 129 deletions
376
README.md
376
README.md
|
|
@ -21,34 +21,18 @@ These chart types are supported: `line`, `bar`, `pie`, `radar` or `funnel`.
|
||||||
|
|
||||||
## Example
|
## Example
|
||||||
|
|
||||||
The example is for `golang option` and `echarts option`, more examples can be found in the `./examples/` directory.
|
More examples can be found in the [./examples/](./examples/) directory.
|
||||||
|
|
||||||
|
|
||||||
|
### Line Chart
|
||||||
```go
|
```go
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"os"
|
charts "github.com/vicanso/go-charts/v2"
|
||||||
"path/filepath"
|
|
||||||
|
|
||||||
charts "github.com/vicanso/go-charts"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func writeFile(file string, buf []byte) error {
|
func main() {
|
||||||
tmpPath := "./tmp"
|
|
||||||
err := os.MkdirAll(tmpPath, 0700)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
file = filepath.Join(tmpPath, file)
|
|
||||||
err = os.WriteFile(file, buf, 0600)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func chartsRender() ([]byte, error) {
|
|
||||||
values := [][]float64{
|
values := [][]float64{
|
||||||
{
|
{
|
||||||
120,
|
120,
|
||||||
|
|
@ -59,6 +43,18 @@ func chartsRender() ([]byte, error) {
|
||||||
230,
|
230,
|
||||||
210,
|
210,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
// snip...
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// snip...
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// snip...
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// snip...
|
||||||
|
},
|
||||||
}
|
}
|
||||||
p, err := charts.LineRender(
|
p, err := charts.LineRender(
|
||||||
values,
|
values,
|
||||||
|
|
@ -72,15 +68,323 @@ func chartsRender() ([]byte, error) {
|
||||||
"Sat",
|
"Sat",
|
||||||
"Sun",
|
"Sun",
|
||||||
}),
|
}),
|
||||||
|
charts.LegendLabelsOptionFunc([]string{
|
||||||
|
"Email",
|
||||||
|
"Union Ads",
|
||||||
|
"Video Ads",
|
||||||
|
"Direct",
|
||||||
|
"Search Engine",
|
||||||
|
}, charts.PositionCenter),
|
||||||
)
|
)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
panic(err)
|
||||||
}
|
|
||||||
return p.Bytes()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func echartsRender() ([]byte, error) {
|
buf, err := p.Bytes()
|
||||||
return charts.RenderEChartsToPNG(`{
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
// snip...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Bar Chart
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/vicanso/go-charts/v2"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
values := [][]float64{
|
||||||
|
{
|
||||||
|
2.0,
|
||||||
|
4.9,
|
||||||
|
7.0,
|
||||||
|
23.2,
|
||||||
|
25.6,
|
||||||
|
76.7,
|
||||||
|
135.6,
|
||||||
|
162.2,
|
||||||
|
32.6,
|
||||||
|
20.0,
|
||||||
|
6.4,
|
||||||
|
3.3,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// snip...
|
||||||
|
},
|
||||||
|
}
|
||||||
|
p, err := charts.BarRender(
|
||||||
|
values,
|
||||||
|
charts.XAxisDataOptionFunc([]string{
|
||||||
|
"Jan",
|
||||||
|
"Feb",
|
||||||
|
"Mar",
|
||||||
|
"Apr",
|
||||||
|
"May",
|
||||||
|
"Jun",
|
||||||
|
"Jul",
|
||||||
|
"Aug",
|
||||||
|
"Sep",
|
||||||
|
"Oct",
|
||||||
|
"Nov",
|
||||||
|
"Dec",
|
||||||
|
}),
|
||||||
|
charts.LegendLabelsOptionFunc([]string{
|
||||||
|
"Rainfall",
|
||||||
|
"Evaporation",
|
||||||
|
}, charts.PositionRight),
|
||||||
|
charts.MarkLineOptionFunc(0, charts.SeriesMarkDataTypeAverage),
|
||||||
|
charts.MarkPointOptionFunc(0, charts.SeriesMarkDataTypeMax,
|
||||||
|
charts.SeriesMarkDataTypeMin),
|
||||||
|
// custom option func
|
||||||
|
func(opt *charts.ChartOption) {
|
||||||
|
opt.SeriesList[1].MarkPoint = charts.NewMarkPoint(
|
||||||
|
charts.SeriesMarkDataTypeMax,
|
||||||
|
charts.SeriesMarkDataTypeMin,
|
||||||
|
)
|
||||||
|
opt.SeriesList[1].MarkLine = charts.NewMarkLine(
|
||||||
|
charts.SeriesMarkDataTypeAverage,
|
||||||
|
)
|
||||||
|
},
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
buf, err := p.Bytes()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
// snip...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Horizontal Bar Chart
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/vicanso/go-charts/v2"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
values := [][]float64{
|
||||||
|
{
|
||||||
|
18203,
|
||||||
|
23489,
|
||||||
|
29034,
|
||||||
|
104970,
|
||||||
|
131744,
|
||||||
|
630230,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// snip...
|
||||||
|
},
|
||||||
|
}
|
||||||
|
p, err := charts.HorizontalBarRender(
|
||||||
|
values,
|
||||||
|
charts.TitleTextOptionFunc("World Population"),
|
||||||
|
charts.PaddingOptionFunc(charts.Box{
|
||||||
|
Top: 20,
|
||||||
|
Right: 40,
|
||||||
|
Bottom: 20,
|
||||||
|
Left: 20,
|
||||||
|
}),
|
||||||
|
charts.LegendLabelsOptionFunc([]string{
|
||||||
|
"2011",
|
||||||
|
"2012",
|
||||||
|
}),
|
||||||
|
charts.YAxisDataOptionFunc([]string{
|
||||||
|
"Brazil",
|
||||||
|
"Indonesia",
|
||||||
|
"USA",
|
||||||
|
"India",
|
||||||
|
"China",
|
||||||
|
"World",
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
buf, err := p.Bytes()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
// snip...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Pie Chart
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/vicanso/go-charts/v2"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
values := []float64{
|
||||||
|
1048,
|
||||||
|
735,
|
||||||
|
580,
|
||||||
|
484,
|
||||||
|
300,
|
||||||
|
}
|
||||||
|
p, err := charts.PieRender(
|
||||||
|
values,
|
||||||
|
charts.TitleOptionFunc(charts.TitleOption{
|
||||||
|
Text: "Rainfall vs Evaporation",
|
||||||
|
Subtext: "Fake Data",
|
||||||
|
Left: charts.PositionCenter,
|
||||||
|
}),
|
||||||
|
charts.PaddingOptionFunc(charts.Box{
|
||||||
|
Top: 20,
|
||||||
|
Right: 20,
|
||||||
|
Bottom: 20,
|
||||||
|
Left: 20,
|
||||||
|
}),
|
||||||
|
charts.LegendOptionFunc(charts.LegendOption{
|
||||||
|
Orient: charts.OrientVertical,
|
||||||
|
Data: []string{
|
||||||
|
"Search Engine",
|
||||||
|
"Direct",
|
||||||
|
"Email",
|
||||||
|
"Union Ads",
|
||||||
|
"Video Ads",
|
||||||
|
},
|
||||||
|
Left: charts.PositionLeft,
|
||||||
|
}),
|
||||||
|
charts.PieSeriesShowLabel(),
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
buf, err := p.Bytes()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
// snip...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Radar Chart
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/vicanso/go-charts/v2"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
values := [][]float64{
|
||||||
|
{
|
||||||
|
4200,
|
||||||
|
3000,
|
||||||
|
20000,
|
||||||
|
35000,
|
||||||
|
50000,
|
||||||
|
18000,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// snip...
|
||||||
|
},
|
||||||
|
}
|
||||||
|
p, err := charts.RadarRender(
|
||||||
|
values,
|
||||||
|
charts.TitleTextOptionFunc("Basic Radar Chart"),
|
||||||
|
charts.LegendLabelsOptionFunc([]string{
|
||||||
|
"Allocated Budget",
|
||||||
|
"Actual Spending",
|
||||||
|
}),
|
||||||
|
charts.RadarIndicatorOptionFunc([]string{
|
||||||
|
"Sales",
|
||||||
|
"Administration",
|
||||||
|
"Information Technology",
|
||||||
|
"Customer Support",
|
||||||
|
"Development",
|
||||||
|
"Marketing",
|
||||||
|
}, []float64{
|
||||||
|
6500,
|
||||||
|
16000,
|
||||||
|
30000,
|
||||||
|
38000,
|
||||||
|
52000,
|
||||||
|
25000,
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
buf, err := p.Bytes()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
// snip...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Funnel Chart
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/vicanso/go-charts/v2"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
values := []float64{
|
||||||
|
100,
|
||||||
|
80,
|
||||||
|
60,
|
||||||
|
40,
|
||||||
|
20,
|
||||||
|
}
|
||||||
|
p, err := charts.FunnelRender(
|
||||||
|
values,
|
||||||
|
charts.TitleTextOptionFunc("Funnel"),
|
||||||
|
charts.LegendLabelsOptionFunc([]string{
|
||||||
|
"Show",
|
||||||
|
"Click",
|
||||||
|
"Visit",
|
||||||
|
"Inquiry",
|
||||||
|
"Order",
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
buf, err := p.Bytes()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
// snip...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### ECharts Render
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/vicanso/go-charts/v2"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
buf, err := charts.RenderEChartsToPNG(`{
|
||||||
"title": {
|
"title": {
|
||||||
"text": "Line"
|
"text": "Line"
|
||||||
},
|
},
|
||||||
|
|
@ -93,25 +397,7 @@ func echartsRender() ([]byte, error) {
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}`)
|
}`)
|
||||||
}
|
// snip...
|
||||||
|
|
||||||
type Render func() ([]byte, error)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
m := map[string]Render{
|
|
||||||
"charts-line.png": chartsRender,
|
|
||||||
"echarts-line.png": echartsRender,
|
|
||||||
}
|
|
||||||
for name, fn := range m {
|
|
||||||
buf, err := fn()
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
err = writeFile(name, buf)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
||||||
403
README_zh.md
403
README_zh.md
|
|
@ -21,53 +21,44 @@
|
||||||
|
|
||||||
|
|
||||||
下面的示例为`go-charts`两种方式的参数配置:golang的参数配置、echarts的JSON配置,输出相同的折线图。
|
下面的示例为`go-charts`两种方式的参数配置:golang的参数配置、echarts的JSON配置,输出相同的折线图。
|
||||||
更多的示例参考:`./examples/`目录
|
更多的示例参考:[./examples/](./examples/)目录
|
||||||
|
|
||||||
|
### Line Chart
|
||||||
```go
|
```go
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"os"
|
charts "github.com/vicanso/go-charts/v2"
|
||||||
"path/filepath"
|
|
||||||
|
|
||||||
charts "github.com/vicanso/go-charts"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func writeFile(file string, buf []byte) error {
|
func main() {
|
||||||
tmpPath := "./tmp"
|
values := [][]float64{
|
||||||
err := os.MkdirAll(tmpPath, 0700)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
file = filepath.Join(tmpPath, file)
|
|
||||||
err = os.WriteFile(file, buf, 0600)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func chartsRender() ([]byte, error) {
|
|
||||||
d, err := charts.LineRender([][]float64{
|
|
||||||
{
|
{
|
||||||
150,
|
120,
|
||||||
|
132,
|
||||||
|
101,
|
||||||
|
134,
|
||||||
|
90,
|
||||||
230,
|
230,
|
||||||
224,
|
210,
|
||||||
218,
|
|
||||||
135,
|
|
||||||
147,
|
|
||||||
260,
|
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
// snip...
|
||||||
},
|
},
|
||||||
// output type
|
{
|
||||||
charts.PNGTypeOption(),
|
// snip...
|
||||||
// title
|
},
|
||||||
charts.TitleOptionFunc(charts.TitleOption{
|
{
|
||||||
Text: "Line",
|
// snip...
|
||||||
}),
|
},
|
||||||
// x axis
|
{
|
||||||
charts.XAxisOptionFunc(charts.NewXAxisOption([]string{
|
// snip...
|
||||||
|
},
|
||||||
|
}
|
||||||
|
p, err := charts.LineRender(
|
||||||
|
values,
|
||||||
|
charts.TitleTextOptionFunc("Line"),
|
||||||
|
charts.XAxisDataOptionFunc([]string{
|
||||||
"Mon",
|
"Mon",
|
||||||
"Tue",
|
"Tue",
|
||||||
"Wed",
|
"Wed",
|
||||||
|
|
@ -75,16 +66,324 @@ func chartsRender() ([]byte, error) {
|
||||||
"Fri",
|
"Fri",
|
||||||
"Sat",
|
"Sat",
|
||||||
"Sun",
|
"Sun",
|
||||||
})),
|
}),
|
||||||
|
charts.LegendLabelsOptionFunc([]string{
|
||||||
|
"Email",
|
||||||
|
"Union Ads",
|
||||||
|
"Video Ads",
|
||||||
|
"Direct",
|
||||||
|
"Search Engine",
|
||||||
|
}, charts.PositionCenter),
|
||||||
)
|
)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
panic(err)
|
||||||
}
|
|
||||||
return d.Bytes()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func echartsRender() ([]byte, error) {
|
buf, err := p.Bytes()
|
||||||
return charts.RenderEChartsToPNG(`{
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
// snip...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Bar Chart
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/vicanso/go-charts/v2"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
values := [][]float64{
|
||||||
|
{
|
||||||
|
2.0,
|
||||||
|
4.9,
|
||||||
|
7.0,
|
||||||
|
23.2,
|
||||||
|
25.6,
|
||||||
|
76.7,
|
||||||
|
135.6,
|
||||||
|
162.2,
|
||||||
|
32.6,
|
||||||
|
20.0,
|
||||||
|
6.4,
|
||||||
|
3.3,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// snip...
|
||||||
|
},
|
||||||
|
}
|
||||||
|
p, err := charts.BarRender(
|
||||||
|
values,
|
||||||
|
charts.XAxisDataOptionFunc([]string{
|
||||||
|
"Jan",
|
||||||
|
"Feb",
|
||||||
|
"Mar",
|
||||||
|
"Apr",
|
||||||
|
"May",
|
||||||
|
"Jun",
|
||||||
|
"Jul",
|
||||||
|
"Aug",
|
||||||
|
"Sep",
|
||||||
|
"Oct",
|
||||||
|
"Nov",
|
||||||
|
"Dec",
|
||||||
|
}),
|
||||||
|
charts.LegendLabelsOptionFunc([]string{
|
||||||
|
"Rainfall",
|
||||||
|
"Evaporation",
|
||||||
|
}, charts.PositionRight),
|
||||||
|
charts.MarkLineOptionFunc(0, charts.SeriesMarkDataTypeAverage),
|
||||||
|
charts.MarkPointOptionFunc(0, charts.SeriesMarkDataTypeMax,
|
||||||
|
charts.SeriesMarkDataTypeMin),
|
||||||
|
// custom option func
|
||||||
|
func(opt *charts.ChartOption) {
|
||||||
|
opt.SeriesList[1].MarkPoint = charts.NewMarkPoint(
|
||||||
|
charts.SeriesMarkDataTypeMax,
|
||||||
|
charts.SeriesMarkDataTypeMin,
|
||||||
|
)
|
||||||
|
opt.SeriesList[1].MarkLine = charts.NewMarkLine(
|
||||||
|
charts.SeriesMarkDataTypeAverage,
|
||||||
|
)
|
||||||
|
},
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
buf, err := p.Bytes()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
// snip...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Horizontal Bar Chart
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/vicanso/go-charts/v2"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
values := [][]float64{
|
||||||
|
{
|
||||||
|
18203,
|
||||||
|
23489,
|
||||||
|
29034,
|
||||||
|
104970,
|
||||||
|
131744,
|
||||||
|
630230,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// snip...
|
||||||
|
},
|
||||||
|
}
|
||||||
|
p, err := charts.HorizontalBarRender(
|
||||||
|
values,
|
||||||
|
charts.TitleTextOptionFunc("World Population"),
|
||||||
|
charts.PaddingOptionFunc(charts.Box{
|
||||||
|
Top: 20,
|
||||||
|
Right: 40,
|
||||||
|
Bottom: 20,
|
||||||
|
Left: 20,
|
||||||
|
}),
|
||||||
|
charts.LegendLabelsOptionFunc([]string{
|
||||||
|
"2011",
|
||||||
|
"2012",
|
||||||
|
}),
|
||||||
|
charts.YAxisDataOptionFunc([]string{
|
||||||
|
"Brazil",
|
||||||
|
"Indonesia",
|
||||||
|
"USA",
|
||||||
|
"India",
|
||||||
|
"China",
|
||||||
|
"World",
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
buf, err := p.Bytes()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
// snip...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Pie Chart
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/vicanso/go-charts/v2"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
values := []float64{
|
||||||
|
1048,
|
||||||
|
735,
|
||||||
|
580,
|
||||||
|
484,
|
||||||
|
300,
|
||||||
|
}
|
||||||
|
p, err := charts.PieRender(
|
||||||
|
values,
|
||||||
|
charts.TitleOptionFunc(charts.TitleOption{
|
||||||
|
Text: "Rainfall vs Evaporation",
|
||||||
|
Subtext: "Fake Data",
|
||||||
|
Left: charts.PositionCenter,
|
||||||
|
}),
|
||||||
|
charts.PaddingOptionFunc(charts.Box{
|
||||||
|
Top: 20,
|
||||||
|
Right: 20,
|
||||||
|
Bottom: 20,
|
||||||
|
Left: 20,
|
||||||
|
}),
|
||||||
|
charts.LegendOptionFunc(charts.LegendOption{
|
||||||
|
Orient: charts.OrientVertical,
|
||||||
|
Data: []string{
|
||||||
|
"Search Engine",
|
||||||
|
"Direct",
|
||||||
|
"Email",
|
||||||
|
"Union Ads",
|
||||||
|
"Video Ads",
|
||||||
|
},
|
||||||
|
Left: charts.PositionLeft,
|
||||||
|
}),
|
||||||
|
charts.PieSeriesShowLabel(),
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
buf, err := p.Bytes()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
// snip...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Radar Chart
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/vicanso/go-charts/v2"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
values := [][]float64{
|
||||||
|
{
|
||||||
|
4200,
|
||||||
|
3000,
|
||||||
|
20000,
|
||||||
|
35000,
|
||||||
|
50000,
|
||||||
|
18000,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// snip...
|
||||||
|
},
|
||||||
|
}
|
||||||
|
p, err := charts.RadarRender(
|
||||||
|
values,
|
||||||
|
charts.TitleTextOptionFunc("Basic Radar Chart"),
|
||||||
|
charts.LegendLabelsOptionFunc([]string{
|
||||||
|
"Allocated Budget",
|
||||||
|
"Actual Spending",
|
||||||
|
}),
|
||||||
|
charts.RadarIndicatorOptionFunc([]string{
|
||||||
|
"Sales",
|
||||||
|
"Administration",
|
||||||
|
"Information Technology",
|
||||||
|
"Customer Support",
|
||||||
|
"Development",
|
||||||
|
"Marketing",
|
||||||
|
}, []float64{
|
||||||
|
6500,
|
||||||
|
16000,
|
||||||
|
30000,
|
||||||
|
38000,
|
||||||
|
52000,
|
||||||
|
25000,
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
buf, err := p.Bytes()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
// snip...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Funnel Chart
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/vicanso/go-charts/v2"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
values := []float64{
|
||||||
|
100,
|
||||||
|
80,
|
||||||
|
60,
|
||||||
|
40,
|
||||||
|
20,
|
||||||
|
}
|
||||||
|
p, err := charts.FunnelRender(
|
||||||
|
values,
|
||||||
|
charts.TitleTextOptionFunc("Funnel"),
|
||||||
|
charts.LegendLabelsOptionFunc([]string{
|
||||||
|
"Show",
|
||||||
|
"Click",
|
||||||
|
"Visit",
|
||||||
|
"Inquiry",
|
||||||
|
"Order",
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
buf, err := p.Bytes()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
// snip...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### ECharts Render
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/vicanso/go-charts/v2"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
buf, err := charts.RenderEChartsToPNG(`{
|
||||||
"title": {
|
"title": {
|
||||||
"text": "Line"
|
"text": "Line"
|
||||||
},
|
},
|
||||||
|
|
@ -97,25 +396,7 @@ func echartsRender() ([]byte, error) {
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}`)
|
}`)
|
||||||
}
|
// snip...
|
||||||
|
|
||||||
type Render func() ([]byte, error)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
m := map[string]Render{
|
|
||||||
"charts-line.png": chartsRender,
|
|
||||||
"echarts-line.png": echartsRender,
|
|
||||||
}
|
|
||||||
for name, fn := range m {
|
|
||||||
buf, err := fn()
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
err = writeFile(name, buf)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
"github.com/vicanso/go-charts"
|
"github.com/vicanso/go-charts/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
func writeFile(buf []byte) error {
|
func writeFile(buf []byte) error {
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ import (
|
||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
charts "github.com/vicanso/go-charts"
|
charts "github.com/vicanso/go-charts/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
var html = `<!DOCTYPE html>
|
var html = `<!DOCTYPE html>
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
"github.com/vicanso/go-charts"
|
"github.com/vicanso/go-charts/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
func writeFile(buf []byte) error {
|
func writeFile(buf []byte) error {
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
"github.com/vicanso/go-charts"
|
"github.com/vicanso/go-charts/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
func writeFile(buf []byte) error {
|
func writeFile(buf []byte) error {
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
"github.com/vicanso/go-charts"
|
"github.com/vicanso/go-charts/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
func writeFile(buf []byte) error {
|
func writeFile(buf []byte) error {
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
"github.com/vicanso/go-charts"
|
"github.com/vicanso/go-charts/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
func writeFile(buf []byte) error {
|
func writeFile(buf []byte) error {
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
charts "github.com/vicanso/go-charts"
|
charts "github.com/vicanso/go-charts/v2"
|
||||||
"github.com/wcharczuk/go-chart/v2/drawing"
|
"github.com/wcharczuk/go-chart/v2/drawing"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
"github.com/vicanso/go-charts"
|
"github.com/vicanso/go-charts/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
func writeFile(buf []byte) error {
|
func writeFile(buf []byte) error {
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
"github.com/vicanso/go-charts"
|
"github.com/vicanso/go-charts/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
func writeFile(buf []byte) error {
|
func writeFile(buf []byte) error {
|
||||||
|
|
|
||||||
8
go.mod
8
go.mod
|
|
@ -1,17 +1,17 @@
|
||||||
module github.com/vicanso/go-charts
|
module github.com/vicanso/go-charts/v2
|
||||||
|
|
||||||
go 1.17
|
go 1.17
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/dustin/go-humanize v1.0.0
|
github.com/dustin/go-humanize v1.0.0
|
||||||
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0
|
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0
|
||||||
github.com/stretchr/testify v1.7.1
|
github.com/stretchr/testify v1.7.2
|
||||||
github.com/wcharczuk/go-chart/v2 v2.1.0
|
github.com/wcharczuk/go-chart/v2 v2.1.0
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||||
golang.org/x/image v0.0.0-20220413100746-70e8d0d3baa9 // indirect
|
golang.org/x/image v0.0.0-20220617043117-41969df76e82 // indirect
|
||||||
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
)
|
)
|
||||||
|
|
|
||||||
15
go.sum
15
go.sum
|
|
@ -8,18 +8,17 @@ github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGw
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY=
|
github.com/stretchr/testify v1.7.2 h1:4jaiDzPyXQvSd7D0EjG45355tLlV3VOECpq10pLC+8s=
|
||||||
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=
|
||||||
github.com/wcharczuk/go-chart/v2 v2.1.0 h1:tY2slqVQ6bN+yHSnDYwZebLQFkphK4WNrVwnt7CJZ2I=
|
github.com/wcharczuk/go-chart/v2 v2.1.0 h1:tY2slqVQ6bN+yHSnDYwZebLQFkphK4WNrVwnt7CJZ2I=
|
||||||
github.com/wcharczuk/go-chart/v2 v2.1.0/go.mod h1:yx7MvAVNcP/kN9lKXM/NTce4au4DFN99j6i1OwDclNA=
|
github.com/wcharczuk/go-chart/v2 v2.1.0/go.mod h1:yx7MvAVNcP/kN9lKXM/NTce4au4DFN99j6i1OwDclNA=
|
||||||
golang.org/x/image v0.0.0-20200927104501-e162460cd6b5/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
golang.org/x/image v0.0.0-20200927104501-e162460cd6b5/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||||
golang.org/x/image v0.0.0-20220413100746-70e8d0d3baa9 h1:LRtI4W37N+KFebI/qV0OFiLUv4GLOWeEW5hn/KEJvxE=
|
golang.org/x/image v0.0.0-20220617043117-41969df76e82 h1:KpZB5pUSBvrHltNEdK/tw0xlPeD13M6M6aGP32gKqiw=
|
||||||
golang.org/x/image v0.0.0-20220413100746-70e8d0d3baa9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
|
golang.org/x/image v0.0.0-20220617043117-41969df76e82/go.mod h1:doUCurBvlfPMKfmIpRIywoHmhN3VyhnoFDbvIEWF4hY=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||||
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
|
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue