Golang语言学习从入门到实战----使用go-chart实现折线图

本文介绍了如何使用Golang的go-chart库生成PNG格式的折线图,用于邮件中的统计信息展示。在邮件不支持JS解析的情况下,go-chart提供了自定义属性的强大功能,虽然默认不支持中文,但可以通过调整实现所需效果。文中还分享了遇到的横纵坐标不显示的问题及其解决方案。
摘要由CSDN通过智能技术生成

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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值