Go使用绘图的库(go-charts、go-echarts)

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),
)

img

在这里插入图片描述

3.参考文档

echarts中文介绍

echarts官方中文文档

go-ehcharts英文文档

几种绘图库介绍

go-charts库


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酷酷的Herio

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值