Go使用绘图的库(go-charts、go-echarts)
1.go-echarts
1.1 实例
直方图
引入依赖
require github.com/go-echarts/go-echarts/v2 v2.2.4
package main
import (
"math/rand"
"os"
"github.com/go-echarts/go-echarts/v2/charts"
"github.com/go-echarts/go-echarts/v2/opts"
)
// generate random data for bar chart
func generateBarItems() []opts.BarData {
items := make([]opts.BarData, 0)
for i := 0; i < 7; i++ {
items = append(items, opts.BarData{Value: rand.Intn(300)})
}
return items
}
func main() {
// create a new bar instance
bar := charts.NewBar()
// set some global options like Title/Legend/ToolTip or anything else
bar.SetGlobalOptions(charts.WithTitleOpts(opts.Title{
Title: "My first bar chart generated by go-echarts",
Subtitle: "It's extremely easy to use, right?",
}))
// Put data into instance
bar.SetXAxis([]string{"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"}).
AddSeries("Category A", generateBarItems()).
AddSeries("Category B", generateBarItems())
// Where the magic happens
f, _ := os.Create("bar.html")
bar.Render(f)
}
效果
当然也可以使用启动 http 服务将图表直接渲染出来
曲线图
package main
import (
"math/rand"
"net/http"
"github.com/go-echarts/go-echarts/v2/charts"
"github.com/go-echarts/go-echarts/v2/opts"
"github.com/go-echarts/go-echarts/v2/types"
)
// generate random data for line chart
func generateLineItems() []opts.LineData {
items := make([]opts.LineData, 0)
for i := 0; i < 7; i++ {
items = append(items, opts.LineData{Value: rand.Intn(300)})
}
return items
}
func httpserver(w http.ResponseWriter, _ *http.Request) {
// create a new line instance
line := charts.NewLine()
// set some global options like Title/Legend/ToolTip or anything else
line.SetGlobalOptions(
charts.WithInitializationOpts(opts.Initialization{Theme: types.ThemeWesteros}),
charts.WithTitleOpts(opts.Title{
Title: "Line example in Westeros theme",
Subtitle: "Line chart rendered by the http server this time",
}))
// Put data into instance
line.SetXAxis([]string{"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"}).
AddSeries("Category A", generateLineItems()).
AddSeries("Category B", generateLineItems()).
SetSeriesOptions(charts.WithLineChartOpts(opts.LineChart{Smooth: true}))
line.Render(w)
}
func main() {
http.HandleFunc("/", httpserver)
http.ListenAndServe(":8081", nil)
}
效果
其他
饼图
package go_chart
import (
"math/rand"
"os"
"testing"
"github.com/go-echarts/go-echarts/v2/charts"
"github.com/go-echarts/go-echarts/v2/opts"
)
var (
itemCntPie = 4
seasons = []string{"Spring", "Summer", "Autumn ", "Winter"}
)
func generatePieItems() []opts.PieData {
items := make([]opts.PieData, 0)
for i := 0; i < itemCntPie; i++ {
items = append(items, opts.PieData{Name: seasons[i], Value: rand.Intn(100)})
}
return items
}
func pieBase() *charts.Pie {
pie := charts.NewPie()
pie.SetGlobalOptions(
charts.WithTitleOpts(opts.Title{Title: "basic pie example"}),
)
pie.AddSeries("pie", generatePieItems())
return pie
}
func pieShowLabel() *charts.Pie {
pie := charts.NewPie()
pie.SetGlobalOptions(
charts.WithTitleOpts(opts.Title{Title: "label options"}),
)
pie.AddSeries("pie", generatePieItems()).
SetSeriesOptions(charts.WithLabelOpts(
opts.Label{
Show: true,
Formatter: "{b}: {c}",
}),
)
return pie
}
func pieRadius() *charts.Pie {
pie := charts.NewPie()
pie.SetGlobalOptions(
charts.WithTitleOpts(opts.Title{Title: "Radius style"}),
)
pie.AddSeries("pie", generatePieItems()).
SetSeriesOptions(
charts.WithLabelOpts(opts.Label{
Show: true,
Formatter: "{b}: {c}",
}),
charts.WithPieChartOpts(opts.PieChart{
Radius: []string{"40%", "75%"},
}),
)
return pie
}
func pieRoseArea() *charts.Pie {
pie := charts.NewPie()
pie.SetGlobalOptions(
charts.WithTitleOpts(opts.Title{
Title: "Rose(Area)",
}),
)
pie.AddSeries("pie", generatePieItems()).
SetSeriesOptions(
charts.WithLabelOpts(opts.Label{
Show: true,
Formatter: "{b}: {c}",
}),
charts.WithPieChartOpts(opts.PieChart{
Radius: []string{"40%", "75%"},
RoseType: "area",
}),
)
return pie
}
func pieRoseRadius() *charts.Pie {
pie := charts.NewPie()
pie.SetGlobalOptions(
charts.WithTitleOpts(opts.Title{
Title: "Rose(Radius)",
}),
)
pie.AddSeries("pie", generatePieItems()).
SetSeriesOptions(
charts.WithLabelOpts(opts.Label{
Show: true,
Formatter: "{b}: {c}",
}),
charts.WithPieChartOpts(opts.PieChart{
Radius: []string{"30%", "75%"},
RoseType: "radius",
}),
)
return pie
}
func pieRoseAreaRadius() *charts.Pie {
pie := charts.NewPie()
pie.SetGlobalOptions(
charts.WithTitleOpts(opts.Title{
Title: "Rose(Area/Radius)",
}),
)
pie.AddSeries("area", generatePieItems()).
SetSeriesOptions(
charts.WithPieChartOpts(opts.PieChart{
Radius: []string{"30%", "75%"},
RoseType: "area",
Center: []string{"25%", "50%"},
}),
)
pie.AddSeries("pie", generatePieItems()).
SetSeriesOptions(
charts.WithLabelOpts(opts.Label{
Show: true,
Formatter: "{b}: {c}",
}),
charts.WithPieChartOpts(opts.PieChart{
Radius: []string{"30%", "75%"},
RoseType: "radius",
Center: []string{"75%", "50%"},
}),
)
return pie
}
func pieInPie() *charts.Pie {
pie := charts.NewPie()
pie.SetGlobalOptions(
charts.WithTitleOpts(opts.Title{
Title: "pie in pie",
}),
)
pie.AddSeries("area", generatePieItems(),
charts.WithLabelOpts(opts.Label{
Show: true,
Formatter: "{b}: {c}",
}),
charts.WithPieChartOpts(opts.PieChart{
Radius: []string{"50%", "55%"},
RoseType: "area",
}),
)
pie.AddSeries("radius", generatePieItems(),
charts.WithPieChartOpts(opts.PieChart{
Radius: []string{"0%", "45%"},
RoseType: "radius",
}),
)
return pie
}
type PieExamples struct{}
//func TestPie(t *testing.T) {
// //(PieExamples)
// page := components.NewPage()
// page.AddCharts(
// pieBase(),
// pieShowLabel(),
// pieRadius(),
// pieRoseArea(),
// pieRoseRadius(),
// pieRoseAreaRadius(),
// pieInPie(),
// )
// f, err := os.Create("examples/html/pie.html")
// if err != nil {
// panic(err)
// }
// page.Render(io.MultiWriter(f))
//}
func TestPie(t *testing.T) {
// create a new bar instance
pie := pieBase()
// Where the magic happens
f, _ := os.Create("pie.html")
pie.Render(f)
}
2.go-charts
xValue := []string{}
yValue := [][]float64{}
// 处理结果
for _, value := range allRequest[0].Series[0].Values {
tempY := []float64{}
resultX := value[0].(string)
xValue = append(xValue, resultX)
number, _ := value[1].(json.Number)
resultY, _ := number.Float64()
tempY = append(tempY, resultY)
}
// 对 x 轴格式化 原:2022-07-29T09:24:10Z,新:09:24:10
formatXValue := []string{}
for _, x := range xValue {
formatTime, err := time.Parse(time.RFC3339, x)
if err != nil {
}
formatX := formatTime.Local().Format("15:04:05")
formatXValue = append(formatXValue, formatX)
}
f := false // 设置 x 轴的样式
// 字体文件需要自行下载
buff, err := ioutil.ReadFile("./TencentSans-W7.ttf")
if err != nil {
panic(err)
}
err = charts.InstallFont("noto", buff)
if err != nil {
panic(err)
}
// 渲染图表
p, err := charts.LineRender(
yValue,
charts.FontFamilyOptionFunc("noto"),
charts.TitleTextOptionFunc("全部请求"),
charts.XAxisDataOptionFunc(xValue),
func(opt *charts.ChartOption) {
opt.XAxis.BoundaryGap = &f
opt.Padding = charts.Box{Left: 20, Right: 50, Top: 20, Bottom: 20}
},
charts.ThemeOptionFunc("grafana"),
charts.WidthOptionFunc(1000),
)