Why this
最近在实现一个某某模块功能,邮件中实现统计信息的发送,其中涉及到需要在邮件正文中嵌入图表(折线图,饼图等等)
由于邮件中无法支持js解析,不能按照寻常方式制作图标。通过翻阅大量资料,发现go-chart可以生成PNG图片形式的图表,因此尝试使用https://github.com/wcharczuk/go-chart
库实现操作。
How to
go-chart
是个强大的go生成图片的库,但是采用默认配置生成线条较多或者文本过长的图片时,无法完美适应。默认不支持中文。但是里面的属性大多可自己定义,整体来说非常强大
文档地址:https://godoc.org/github.com/wcharczuk/go-chart
更多的图表参考example
文件夹
# 在$GOPATH/src下新建文件夹
mkdir go-chartDemo
cd go-chartDemo
vim lineChartDemo_test.go
go mod init
go mod tidy
go test lineChartDemo_test.go
代码
lineChartDemo_test.go
package main
import (
"bytes"
"encoding/base64"
"fmt"
"math/rand"
"os"
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/wcharczuk/go-chart"
"github.com/wcharczuk/go-chart/drawing"
)
const (
lineChartXAxisName = "Date"
lineChartYAxisName = "Count"
lineChartHeight = 700
lineChartWidth = 1280
colorMultiplier = 256
imgStrPrefix = "data:image/png;base64,"
pieLabelFormat = "%v %v"
barChartTryAgainErr = "invalid data range; cannot be zero"
)
var (
lineChartStyle = chart.Style{
Show: true,
Padding: chart.Box{
Top: 30,
Left: 150,
},
}
defaultChartStyle = chart.Style{
Show: true,
Padding: chart.Box{
Top: 30,
},
}
timeFormat = chart.TimeDateValueFormatter
)
type LineYValue struct {
Name string
Values []float64
}
// createLineChart 创建线性图
func createLineChart(title string, endTime time.Time, values []LineYValue) (img string, err error) {
if len(values) == 0 {
return
}
// 1、计算X轴
lenX := len(values[0].Values)
// X轴内容xValues 及 X轴坐标ticks
var xValues []time.Time
var ticks []chart.Tick
for i := lenX - 1; i >= 0; i-- {
curTime := endTime.AddDate(0, 0, -i)
xValues = append(xValues, curTime)
ticks = append(ticks, chart.Tick{
Value: getNsec(curTime), Label: timeFormat(curTime)})
}
// 2、生成Series
var series []chart.Series
for _, yValue := range values {
series = append(series, chart.TimeSeries{
Name: yValue.Name,
Style: chart.Style{
Show: true,
// 随机渲染线条颜色
StrokeColor: drawing.Color{
R: uint8(rand.Intn(colorMultiplier)),
G: uint8(rand.Intn(colorMultiplier